【问题标题】:Show two or more rows in a single row在一行中显示两行或多行
【发布时间】:2016-04-21 20:44:08
【问题描述】:

我有这四个表:

餐桌优惠

  • 身份证
  • id_company
  • 说明

表公司

  • 身份证
  • 姓名

表 company_customer

  • id_company
  • id_customer

表客户

  • 身份证
  • 姓名

我需要获得报价、提供报价的公司以及与这些公司有关系的客户。这很简单。

我输入的查询如下:

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;

“问题”是有时一家公司的报价可用于不同的客户。

让我用一个真实的例子告诉你这个问题:

“易趣”| '报价 1' | '客户 1' '易趣' | '报价 1' | '客户 2'

但我需要在一行中连接或显示两行(仅在公司和报价相同但客户不同的情况下)。换句话说,我需要以下结果:

“易趣”| '报价 1' | '客户 1,客户 2'

我使用 PHP 和 MySQL。我知道这可以用 PHP 完成,但我想知道是否可以只用 MySQL 来完成。

有什么想法吗??

任何帮助将不胜感激。我为我的英语水平道歉。我知道这不是我最好的。

提前感谢您的时间和关注。

【问题讨论】:

标签: php mysql rows


【解决方案1】:

您需要按公司和报价进行分组,因此您需要以下查询:

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

但如果你想要那样,那么一切都好。

【讨论】:

    【解决方案2】:

    您可以使用聚合的 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

    【讨论】:

      【解决方案3】:

      在您当前的表格设计中无法表示这一点,因为报价可以参考(最多)一家公司。为了做你想做的事,你需要添加一个带有 id_company 和 id_offer 的 offer_company 表,并从 offer 表中删除 id_company 字段。然后,您将在查询中添加一个额外的连接列,并添加一个 group by 子句来将具有相同优惠的行分组在一起。

      将行组合在一起后,您可以在 php 代码中将它们合并为一行,将客户信息连接起来。

      【讨论】:

        猜你喜欢
        • 2020-01-10
        • 1970-01-01
        • 2019-03-26
        • 2018-07-22
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        相关资源
        最近更新 更多