如何在单个 mysql 查询中多重连接来自多个关系表的值
How to multiple concatenate values from multiple relation tables in a single mysql query
我的 "traveling offer" 项目有一个大问题,99% 正常,但不是 100%。
我有主 table 报价,其中每个报价可以设置多个部门城市以及多个目的地城市(这是减少列的减少样本)。
比如,我提供一些从英国出发的旅行,其中的省份城市可以是伦敦、利兹和曼彻斯特。目的地城市为布拉格、布拉迪斯拉发、布达佩斯和贝尔格莱德。
Offer 1 设置为伦敦或利兹的省会城市,目的地为布拉格和布达佩斯。
Offer 2 定为百货城市伦敦,目的地为布拉迪斯拉发和贝尔格莱德。
Offer 3 设置为部门城市曼彻斯特或利兹,目的地为布拉格。
Table offers
----------------------------
id title price
----------------------------
1 Offer 1 title 300 Eur
2 Offer 2 title 250 Eur
3 Offer 3 title 350 Eur
现在关系 tables 和城市名称 tables
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
如果您能注意到,要约 1 中没有布达佩斯。如何获得完整的串联字符串...并不是说 WHERE 子句可以更复杂,即搜索部门城市或任何其他参数。
感谢任何帮助:)
您需要使用与 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
我的 "traveling offer" 项目有一个大问题,99% 正常,但不是 100%。
我有主 table 报价,其中每个报价可以设置多个部门城市以及多个目的地城市(这是减少列的减少样本)。
比如,我提供一些从英国出发的旅行,其中的省份城市可以是伦敦、利兹和曼彻斯特。目的地城市为布拉格、布拉迪斯拉发、布达佩斯和贝尔格莱德。
Offer 1 设置为伦敦或利兹的省会城市,目的地为布拉格和布达佩斯。 Offer 2 定为百货城市伦敦,目的地为布拉迪斯拉发和贝尔格莱德。 Offer 3 设置为部门城市曼彻斯特或利兹,目的地为布拉格。
Table offers
----------------------------
id title price
----------------------------
1 Offer 1 title 300 Eur
2 Offer 2 title 250 Eur
3 Offer 3 title 350 Eur
现在关系 tables 和城市名称 tables
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
如果您能注意到,要约 1 中没有布达佩斯。如何获得完整的串联字符串...并不是说 WHERE 子句可以更复杂,即搜索部门城市或任何其他参数。
感谢任何帮助:)
您需要使用与 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