2

我在 MySQL 数据库中有 4 个表,suppliers, categories, subcats& listings

Listings 是一个连接表,允许供应商、类别和子目录之间的多对多关系,每个的结构如下

供应商

sp_id      sp_name       sp_email
1          Apple         info@apple.co
2          Samsung       info@samsung.co

类别

cat_id     cat_name
3          Electronics
4          Software

子猫

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         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 的了解有限,任何朝着正确方向提出的建议或建议将不胜感激。

4

3 回答 3

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
于 2013-02-21T00:36:47.823 回答
0

您可以GROUP BY结合使用GROUP_CONCAT以仅显示来自某个列的唯一值,其中一个以逗号分隔的列表作为值之一。

于 2013-02-21T00:35:42.647 回答
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;

于 2013-02-21T00:42:02.150 回答