【问题标题】:How to group mysql inner join results from rows into columns如何将mysql内部连接结果从行分组到列
【发布时间】:2012-09-26 03:15:30
【问题描述】:

也许我的问题不是很清楚,请让我解释一下: 我需要的是获取所有用户的列表以及相应的客户编号/批发商组合,每个客户都有 1 到 4 个不同的客户编号/批发商组合

在我的数据库中,我有 2 个表

USERS
id | name
---------
1  | a
2  | b

CLIENT_NUMBERS
id | user_id | number | wholesaler
----------------------------------
1  | 1       | ac1    | aw1
2  | 1       | ac2    | aw2
3  | 2       | bc1    | bw1

使用简单的 INNER JOIN 我得到了重复的客户行,每个对应的客户编号/批发商一个

我已经设法在此查询中使用 GROUP_CONCAT 修复了结果:

SELECT a.id AS user_id, a.name AS Name 
GROUP_CONCAT(b.client_no, ', ', b.wholesaler SEPARATOR '; ') AS client_no_wholesaler 
FROM users AS a 
INNER JOIN client_numbers AS b ON a.id = b.user_id 
GROUP BY ID

user_id | name | client_no_wholesaler
--------------------------------------------
1       | a    |  ac1, aw1; ac2, aw2 
2       | b    |  bc1, bw1

到目前为止一切都很好,但我需要将客户编号/批发商组合“分解”到不同的列中,以便我的结果如下所示:

user_id | name | client_no_wholesaler1 | client_no_wholesaler2 | ...up to 4
----------------------------------------------------------------------------
1       | a    |  ac1, aw1             | ac2, aw2              |
2       | b    |  bc1, bw1             |                       |

在使用简单的 PHP 分解获得查询结果后执行此操作不是一个选项,因为我使用一个类来生成 XLS 文件,并且它基于我的查询结果列,任何想法都将不胜感激。

【问题讨论】:

    标签: mysql group-by concat


    【解决方案1】:

    您想要的通常称为“pivot”。

    以下是您如何在 sql 中使用每个额外列的额外连接对其进行编码:

    SELECT
        a.id AS user_id,
        a.name AS Name,
        CONCAT(b1.client_no, ', ', b1.wholesaler) AS client_no_wholesaler1,
        CONCAT(b2.client_no, ', ', b2.wholesaler) AS client_no_wholesaler2,
        CONCAT(b3.client_no, ', ', b3.wholesaler) AS client_no_wholesaler3,
        CONCAT(b4.client_no, ', ', b4.wholesaler) AS client_no_wholesaler4
    FROM users AS a
    JOIN client_numbers AS b1 ON b1.user_id = a.id
    LEFT JOIN client_numbers AS b2 ON b2.user_id = a.id and b2.id > b1.id
    LEFT JOIN client_numbers AS b3 ON b3.user_id = a.id and b3.id > b2.id
    LEFT JOIN client_numbers AS b4 ON b4.user_id = a.id and b4.id > b3.id
    GROUP BY 1, 2
    

    请注意,额外连接通过在ON 子句中为额外连接添加不断增加的 id 条件来避免重复连接。如果 id 不是合适的排序列,请选择其他东西来分隔连接。

    【讨论】:

    • "Pivot" 我今天学到了一些新东西,非常感谢,您的查询可以满足我的需要
    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 2016-03-08
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多