我在MySQL数据库中有4个表,suppliers
,categories
,subcats
& listings
。
listing是一个连接表,允许供应商,类别和子类之间的多对多关系,每个的结构如下
供应商
sp_id sp_name sp_email
1 Apple info@apple.co
2 Samsung info@samsung.co
类别
cat_id cat_name
3 Electronics
4 Software
subcats
subcat_id subcat_name cat_id
5 Mobiles 3
6 Computers 3
选
list_id sp_id subcat_id
1 1 5
2 1 6
我正在尝试将数据合并在一起,因此每个供应商只有一个条目,列出了多个子类别,例如:
RESULT
sp_id sp_name sp_email cat_name / cats subcat_name / subcats
1 Apple info@apple.co Electronics, Software Mobiles, Computers
2 Samsung info@samsung.co Electronics Mobiles
目前我有以下查询
SELECT *
FROM suppliers as s
LEFT JOIN listings as l ON s.sp_id=l.sp_id
LEFT JOIN subcats as p ON p.subcat_id=l.subcat_id
LEFT JOIN categories as c ON c.cat_id=p.cat_id
ORDER BY s.sp_id
然而,这会为每个供应商输出多个条目,每个类别或与其关联的子类别的一个条目。有没有更简单的方法通过SQL或PHP中的多个查询来完成它?
我对mySQL目前的知识极限,并且非常感谢任何正确方向的建议或刺激。
答案 0 :(得分:1)
使用GROUP_CONCAT
SELECT s.*,
GROUP_CONCAT(c.cat_name) catName,
GROUP_CONCAT(p.subcat_name) subcatName
FROM suppliers as s
LEFT JOIN listings as l ON s.sp_id=l.sp_id
LEFT JOIN subcats as p ON p.subcat_id=l.subcat_id
LEFT JOIN categories as c ON c.cat_id=p.cat_id
GROUP BY s.sp_id, s.sp_name, s.sp_email
ORDER BY s.sp_id
答案 1 :(得分:0)
您可以将GROUP BY
与GROUP_CONCAT
结合使用,仅显示某个列中的唯一值,并以逗号分隔列表作为其中一个值。
答案 2 :(得分:0)
您希望将GROUP BY
表达式与GROUP_CONCAT
函数一起使用。这将允许您将共享某些值的行合并在一起,同时连接它们不共享的行。例如,在您的情况下,这可能会像:
SELECT s.sp_id, s.sp_name, group_concat(', ', c.cat_name)
FROM suppliers as s
LEFT JOIN listings as l ON s.sp_id=l.sp_id
LEFT JOIN subcats as p ON p.subcat_id=l.subcat_id
LEFT JOIN categories as c ON c.cat_id=p.cat_id
ORDER BY s.sp_id
GROUP BY s.sp_id, s.sp_name;