2013-02-21 59 views
2

我有4个表中MySQL数据库,supplierscategoriessubcats & listings结合多个MySQL行,而不重复

上市是一个连接表,让许多供应商,类别和subcats之间的多对多关系,每个结构如下

供应商

sp_id  sp_name  sp_email 
1   Apple   [email protected] 
2   Samsung  [email protected] 

类别

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 

我想结合,共同提取数据,所以每个供应商只有一个入口与多个子类别列出如:

结果

sp_id  sp_name  sp_email   cat_name/cats  subcat_name/subcats 
1   Apple   [email protected] Electronics, Software Mobiles, Computers 
2   Samsung  [email protected] 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知识的限制和任何建议或正确的方向prods将不胜感激。

回答

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 
+0

非常感谢这个工作得十分完美,我学到了一些东西。 – themightyant 2013-02-21 11:35:03

0

您可以将GROUP BYGROUP_CONCAT组合使用,以仅以逗号分隔的列表显示某个列中的唯一值作为其中一个值。

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;