2013-02-21 64 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;