【问题标题】:How to multiple concatenate values from multiple relation tables in a single mysql query如何在单个 mysql 查询中连接多个关系表中的多个值
【发布时间】:2017-10-13 03:03:04
【问题描述】:

我的“旅行优惠”项目有一个大问题,工作 99% OK,但不是 100%。

我有一个带有报价的主表,其中每个报价可以设置多个部门城市以及多个目的地城市(这是减少列的缩减样本)。

例如,我提供了一些从英格兰出发的旅行,那里的部门城市可能来自伦敦、利兹和曼彻斯特。目的地城市是布拉格、布拉迪斯拉发、布达佩斯和贝尔格莱德。

优惠 1 设置为伦敦或利兹省城市,目的地为布拉格和布达佩斯。 优惠 2 设置为部门城市伦敦,目的地是布拉迪斯拉发和贝尔格莱德。 优惠 3 设置为部门城市曼彻斯特或利兹,目的地为布拉格。

Table offers
----------------------------
id  title            price
----------------------------
1   Offer 1 title    300 Eur
2   Offer 2 title    250 Eur
3   Offer 3 title    350 Eur

现在关系表和城市名称表

Table departments
----------------------------
id  name
----------------------------
1   London
2   Leeds
3   Manchester


relation Table rel_departments
------------------------
offer_id  rel_id
------------------------
1         1
1         2
2         1
3         2
3         3


Table destinations
----------------------------
id  name
----------------------------
1   Prague
2   Bratislava
3   Budapest
4   Belgrade


relation Table rel_destinations
------------------------
offer_id  rel_id
------------------------
1         1
1         3
2         2
2         4
3         1

作为 SQL 结果,我期望为部门城市和目的地城市的每个提供连接值机器人

如果我使用以下 sql 搜索所有内容,我得到了 OK 结果:

SELECT offers.*, 
  GROUP_CONCAT(DISTINCT DEPC.name SEPARATOR ', ') AS depCities,
  GROUP_CONCAT(DISTINCT DESTC.name SEPARATOR ', ') AS destCities
FROM offers
INNER JOIN `rel_departments` ON (`rel_departments`.`offer_id` = `offers`.`id`)
INNER JOIN `departments` as DEPC ON (DEPC.`id` = `rel_departments`.`rel_id`)
INNER JOIN `rel_destinations` ON (`rel_destinations`.`offer_id` = `offers`.`id`)
INNER JOIN `destinations` as DESTC ON (DESTC.`id` = `rel_destinations`.`rel_id`)
GROUP BY offers.id

结果会好的:

---------------------------------------------------------------------
id  title            price    depCities          destCities
---------------------------------------------------------------------
1   Offer 1 title    300 Eur  London, Leeds      Prague, Budapest
2   Offer 2 title    250 Eur  London             Bratislava, Belgrade
3   Offer 3 title    350 Eur  Leeds, Manchester  Prague

无论 WHERE 子句是什么,我都需要这样的结果。但是,每当我放置 where 子句时,我都会在连接中丢失一个结果。例如,我搜索所有以布拉格为目的地的报价。如果我添加到sql语句的末尾:

where rel_destinations.rel_id=1

结果如下:

---------------------------------------------------------------------
id  title            price    depCities          destCities
---------------------------------------------------------------------
1   Offer 1 title    300 Eur  London, Leeds      Prague
3   Offer 3 title    350 Eur  Leeds, Manchester  Prague

如果您注意到,offer 1 中没有 Budapest。如何获得完整的连接字符串...并不是说 WHERE 子句可以更复杂,即搜索部门城市或任何其他参数。

任何帮助表示赞赏:)

【问题讨论】:

  • 认真考虑处理应用代码中数据显示的问题。
  • @Strawberry 这不是显示问题,而是在查询中选择所有正确数据的问题。

标签: mysql group-concat


【解决方案1】:

您需要使用与rel_destinations 不同的连接来获得以布拉格为目的地的优惠。将其与您的原始查询一起加入。

SELECT offers.*, 
  GROUP_CONCAT(DISTINCT DEPC.name SEPARATOR ', ') AS depCities,
  GROUP_CONCAT(DISTINCT DESTC.name SEPARATOR ', ') AS destCities
FROM offers
INNER JOIN `rel_departments` ON (`rel_departments`.`offer_id` = `offers`.`id`)
INNER JOIN `departments` as DEPC ON (DEPC.`id` = `rel_departments`.`rel_id`)
INNER JOIN `rel_destinations` ON (`rel_destinations`.`offer_id` = `offers`.`id`)
INNER JOIN `destinations` as DESTC ON (DESTC.`id` = `rel_destinations`.`rel_id`)
INNER JOIN rel_destinations AS d1 ON d1.offer_id = offers.id
WHERE d1.rel_id = 1
GROUP BY offers.id

DEMO

【讨论】:

  • 如果解决了问题别忘了采纳答案
  • 我做到了,别担心 :)
猜你喜欢
  • 2018-11-06
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2016-07-22
  • 2018-03-29
相关资源
最近更新 更多