【问题标题】:Concatenate multiple columns and sort within a row连接多列并在一行内排序
【发布时间】:2014-06-04 15:51:14
【问题描述】:

我有一个包含以下字段的表:

+------------------------------+
|  id  | cart1 | cart2 | cart3 |
|------------------------------|
|  1   |  ball |  soap |  NULL |
|  2   | apple | towel | paper |
|  3   |  soap |  ball |  NULL |
| .... | ..... | ..... | ..... |
+------------------------------+

我想要以下输出:

+-----------------------------------------+
| item1 | item2 | item3 | num_appearances |
|-----------------------------------------|
| ball  | soap  |  NULL |        2        |
| apple | towel | paper |        1        |
| ..... | ..... | ..... | ............... |
+-----------------------------------------+

基本上cart1cart2cart3定义了一个人的购物车,但是顺序无所谓,我想统计一组物品一起购买的次数,再次与顺序无所谓。所以appletowelpaper在样本表中出现了一次,ballsoap出现了两次。

我认为我需要做的是对item1item2item3 进行排序,将它们连接起来,然后按连接后的值进行分组。所以group_concat 听起来很棒,我可以按id 分组,或者每行不同的其他列。但到目前为止我有group_concat(item1, item2, item3 [ORDER BY WHAT])。但是如何对列列表进行排序并返回该连接的排序列表?

【问题讨论】:

  • 我首先将三个 cart# 列合并为一个列。
  • @TrippKinetics - 这就是我想要通过group_concat 实现的目标。很遗憾,我无法更改架构。

标签: mysql sorting group-by concatenation group-concat


【解决方案1】:

@Strawberry 的建议结合我的“崩溃”想法。

SELECT  combo, COUNT(combo) total
FROM
(
    SELECT  id, GROUP_CONCAT(item ORDER BY item) combo
    FROM
    (
        SELECT  id, item1 item
        FROM    cart_table
        UNION ALL
        SELECT  id, item2
        FROM    cart_table
        UNION ALL
        SELECT  id, item3
        FROM    cart_table
    )
)
GROUP BY combo

尽管我不喜欢嵌套子查询...

【讨论】:

    【解决方案2】:
    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (id  INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,cart_no INT NOT NULL
    ,item VARCHAR(12) NOT NULL
    ,qty INT NOT NULL DEFAULT 1
    ,UNIQUE(cart_no,item)
    );
    
    INSERT INTO my_table VALUES
    (1,1,'ball',1),
    (2,1,'soap',1),
    (3,2,'apple',1),
    (4,2,'towel',1),
    (5,2,'paper',1),
    (6,3,'soap',1),
    (7,3,'ball',1);
    
    SELECT cart_no,GROUP_CONCAT(item ORDER BY item) combo FROM my_table GROUP BY cart_no;
    +---------+-------------------+
    | cart_no | combo             |
    +---------+-------------------+
    |       1 | ball,soap         |
    |       2 | apple,paper,towel |
    |       3 | ball,soap         |
    +---------+-------------------+
    
    SELECT combo, COUNT(0) total FROM
    (
    SELECT cart_no,GROUP_CONCAT(item ORDER BY item) combo FROM my_table GROUP BY cart_no
    ) x
    GROUP BY combo;
    +-------------------+-------+
    | combo             | total |
    +-------------------+-------+
    | apple,paper,towel |     1 |
    | ball,soap         |     2 |
    +-------------------+-------+
    

    【讨论】:

    • 但这并不是我想要的,因为这里有一个名为 item 的列与 cart_no 相关联,而在我的表中,每一行都包含购物车(item1item2item3)。由于无法解释的原因,我知道购物车不会超过 3 件商品,所以我以这种方式存储数据。
    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2021-03-13
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多