在一行中显示两行或多行
Show two or more rows in a single row
我有这四个 table:
table 优惠
- 编号
- id_company
- 描述
table 家公司
- id
- 名字
table company_customer
- id_company
- id_customer
table 客户
- id
- 名字
我需要获取报价、提供报价的公司以及与这些公司有关系的客户。很简单。
我输入的查询如下:
SELECT c.name, c.description, cu.name cu_name
FROM companies c
INNER JOIN offers o ON o.id_company = c.id
INNER JOIN company_customer cc ON cc.id_company = c.id
INNER JOIN customers cu ON cu.id = cc.id_customer
WHERE o.id_company = 1
ORDER BY o.id_company;
"problem"就是有时候一个公司的offer是可以提供给不同的客户的。
让我用一个真实的例子来告诉你这个问题:
'Ebay' | 'offer number 1' | 'customer 1'
'Ebay' | 'offer number 1' | 'customer 2'
但我需要将两行连接或显示在一行中(仅在公司和报价相同但客户不同的情况下)。换句话说,我需要以下结果:
'Ebay' | 'offer number 1' | 'customer 1, customer 2'
我与 PHP 和 MySQL 一起工作。我知道这可以用 PHP 来完成,但我想知道是否可以用 MySQL.
来完成
有什么想法吗??
任何帮助将不胜感激。我为我的英语水平道歉。我知道这不是我最好的。
提前感谢您的时间和关注。
在您当前的 table 设计中无法表示这一点,因为报价最多只能引用一家公司。要执行您希望的操作,您需要使用 id_company 和 id_offer 添加 offer_company table,并从报价 [=19] 中删除 id_company 字段=].然后,您将向查询添加一个额外的连接列,并添加一个 group by 子句以将具有相同报价的行分组在一起。
将行组合在一起后,您可以在 php 代码中将它们合并为一行,连接客户信息。
您可以使用聚合 GROUP_CONCAT 函数
SELECT c.name, c.description, GROUP_CONCAT(string SEPARATOR ',')
FROM <<table And Joins...>>
GROUP BY c.name, c.description;
见他http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
您需要同时按公司和报价分组,因此您需要此查询:
SELECT
c.`name` AS companyName,
o.description AS offerName,
GROUP_CONCAT(cs.`name` ORDER BY cs.id) AS customerNames
FROM
companies c
INNER JOIN offers o ON o.id_company = c.id
INNER JOIN company_customer cc ON cc.id_company = c.id
INNER JOIN customers cs ON cs.id = cc.id_customer
WHERE
c.id = 1
GROUP BY
c.`name`,
o.description
Amyway 在你的数据库中没有报价和客户之间的关系,所以你可以考虑添加这样的。否则该公司的所有客户将出现在该公司的每个报价中:
+-------------+-----------+----------------------------------+
| companyName | offerName | customerNames |
+-------------+-----------+----------------------------------+
| Ebay | Offer 1 | Customer 1,Customer 2,Customer 3 |
| Ebay | Offer 2 | Customer 1,Customer 2,Customer 3 |
+-------------+-----------+----------------------------------+
2 rows in set
但如果你真的想要那个,那一切都可以。
我有这四个 table:
table 优惠
- 编号
- id_company
- 描述
table 家公司
- id
- 名字
table company_customer
- id_company
- id_customer
table 客户
- id
- 名字
我需要获取报价、提供报价的公司以及与这些公司有关系的客户。很简单。
我输入的查询如下:
SELECT c.name, c.description, cu.name cu_name
FROM companies c
INNER JOIN offers o ON o.id_company = c.id
INNER JOIN company_customer cc ON cc.id_company = c.id
INNER JOIN customers cu ON cu.id = cc.id_customer
WHERE o.id_company = 1
ORDER BY o.id_company;
"problem"就是有时候一个公司的offer是可以提供给不同的客户的。
让我用一个真实的例子来告诉你这个问题:
'Ebay' | 'offer number 1' | 'customer 1' 'Ebay' | 'offer number 1' | 'customer 2'
但我需要将两行连接或显示在一行中(仅在公司和报价相同但客户不同的情况下)。换句话说,我需要以下结果:
'Ebay' | 'offer number 1' | 'customer 1, customer 2'
我与 PHP 和 MySQL 一起工作。我知道这可以用 PHP 来完成,但我想知道是否可以用 MySQL.
来完成有什么想法吗??
任何帮助将不胜感激。我为我的英语水平道歉。我知道这不是我最好的。
提前感谢您的时间和关注。
在您当前的 table 设计中无法表示这一点,因为报价最多只能引用一家公司。要执行您希望的操作,您需要使用 id_company 和 id_offer 添加 offer_company table,并从报价 [=19] 中删除 id_company 字段=].然后,您将向查询添加一个额外的连接列,并添加一个 group by 子句以将具有相同报价的行分组在一起。
将行组合在一起后,您可以在 php 代码中将它们合并为一行,连接客户信息。
您可以使用聚合 GROUP_CONCAT 函数
SELECT c.name, c.description, GROUP_CONCAT(string SEPARATOR ',')
FROM <<table And Joins...>>
GROUP BY c.name, c.description;
见他http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
您需要同时按公司和报价分组,因此您需要此查询:
SELECT
c.`name` AS companyName,
o.description AS offerName,
GROUP_CONCAT(cs.`name` ORDER BY cs.id) AS customerNames
FROM
companies c
INNER JOIN offers o ON o.id_company = c.id
INNER JOIN company_customer cc ON cc.id_company = c.id
INNER JOIN customers cs ON cs.id = cc.id_customer
WHERE
c.id = 1
GROUP BY
c.`name`,
o.description
Amyway 在你的数据库中没有报价和客户之间的关系,所以你可以考虑添加这样的。否则该公司的所有客户将出现在该公司的每个报价中:
+-------------+-----------+----------------------------------+
| companyName | offerName | customerNames |
+-------------+-----------+----------------------------------+
| Ebay | Offer 1 | Customer 1,Customer 2,Customer 3 |
| Ebay | Offer 2 | Customer 1,Customer 2,Customer 3 |
+-------------+-----------+----------------------------------+
2 rows in set
但如果你真的想要那个,那一切都可以。