当我们需要做一对多的关联查询时,会很容易想到用left join来实现。例如,现有country表和city表之间建立了一对多的关联关系。如果要展示各国家以及城市列表,会很容易想到以下SQL:
SELECT
country, city
FROM
country
LEFT JOIN city ON country.country_id = city.country_id
得到:
这里虽然获取了所有国家的城市列表,但由于一对多的关系,会导致country有大量重复,total值也变得很大,如何把相同的国家城市折叠到一起呢?答案是使用Mysql的GROUP_CONCAT函数,它可以对父表分组后,把子数据合并到一起展示:
SELECT
country, GROUP_CONCAT(city.city) as citys
FROM
country
LEFT JOIN city ON country.country_id = city.country_id
GROUP BY country.country
得到:
如果需要对城市做条件匹配,还可以加上having子句:
SELECT
country, GROUP_CONCAT(city.city) as citys
FROM
country
LEFT JOIN city ON country.country_id = city.country_id
GROUP BY country.country
HAVING citys like '%Yuzhou%'
得到:
可以看出,使用好GROUP_CONCAT函数,能够快速地抓取子表中的数据做展示。