代码之家  ›  专栏  ›  技术社区  ›  David

GroupBy ID,但保留多个值

  •  2
  • David  · 技术社区  · 6 年前

    我有以下mysql表:

    +----------+----------+---------+-------------+------------+----------+----------+-----------+
    | queue_id | email_id | user_id | customer_id |  send_date | campaign | approved | scheduled |
    +----------+----------+---------+-------------+------------+----------+----------+-----------+
    |    1     |    1     |    1    |      1      | 2018-10-30 |     1    |     1    |     1     |
    |    2     |    1     |    2    |      1      | 2018-10-30 |     1    |     1    |     1     |
    |    3     |    2     |    1    |      1      | 2018-11-02 |     1    |     1    |     1     |
    |    4     |    2     |    2    |      1      | 2018-11-02 |     1    |     0    |     1     |
    |    5     |    2     |    3    |      1      | 2018-11-02 |     1    |     1    |     1     |
    +----------+----------+---------+-------------+------------+----------+----------+-----------+
    

    何处 email_id , user_id customer_id 都是外键。

    我要做的是把 send_date , subject (它是 email 表即 电鳗 参考文件),以及 name (它是 business 表即 用户标识 引用),但仅适用于 approved 列为真。其想法是最终在HTML表中向用户显示数据,该表将如下所示(使用提供的示例数据):

    +--------------------+--------------------------+---------------+
    | October 30th, 2018 | Subject for email_id "1" | View Approved |
    | November 2nd, 2018 | Subject for email_id "2" | View Approved |
    +--------------------+--------------------------+---------------+
    

    每当用户单击“查看已批准”单元格时,它将显示批准该特定电子邮件的所有业务名称。

    我尝试使用以下查询,但它只返回 名称 专栏:

    SELECT
      DATE_FORMAT(q.`send_date`, "%M %D, %Y") AS `date_visited`,
      e.`subject`,
      b.`name`
    FROM
      `email_queue` AS q
    INNER JOIN
      `email`    AS e ON q.`email_id`    = e.`email_id`
    INNER JOIN
      `user`     AS u ON q.`user_id`     = u.`user_id`
    INNER JOIN
      `business` AS b ON u.`business_id` = b.`business_id`
    WHERE
      q.`approved` = true
    GROUP BY
      e.`email_id`
    ORDER BY
      q.`send_date` DESC
    

    如何构造查询,使其返回 名称 列而不是一列?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Madhur Bhaiya    6 年前

    您可以使用逗号分隔字符串获取所有不合格的业务名称。 Group_Concat() 带distinct子句的函数。

    尝试:

    GROUP_CONCAT(DISTINCT b.`name` SEPARATOR ',') AS name  
    

    而不是:

    b.`name`
    

    注:

    • 你可以避免使用 Distinct 条款,如果没有任何副本 user_id (针对特定 email_id 从而确保 b.name 也是独一无二的。
    • 您也可以使用任何分隔符,而不是逗号。例如:使用分隔符作为管道字符 | ,您可以将查询编写为:

      GROUP_CONCAT(DISTINCT b. 名称 SEPARATOR '|') AS name