Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 连接多个列并在一行内排序_Mysql_Sorting_Group By_Concatenation_Group Concat - Fatal编程技术网

Mysql 连接多个列并在一行内排序

Mysql 连接多个列并在一行内排序,mysql,sorting,group-by,concatenation,group-concat,Mysql,Sorting,Group By,Concatenation,Group Concat,我有一个包含以下字段的表: +------------------------------+ | id | cart1 | cart2 | cart3 | |------------------------------| | 1 | ball | soap | NULL | | 2 | apple | towel | paper | | 3 | soap | ball | NULL | | .... | ..... | ..... | ..... | +----

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

+------------------------------+
|  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        |
| ..... | ..... | ..... | ............... |
+-----------------------------------------+
基本上,
cart1
cart2
cart3
定义了一个人的购物车,但订单并不重要,我想计算一组商品一起购买的次数,同样,订单并不重要。因此,
apple
tob
paper
在样本表中出现了一次,
ball
soap
出现了两次


我想我需要做的是对
item1
item2
item3
进行排序,将它们连接起来,然后根据连接的值进行分组。所以
group\u concat
听起来不错,我可以根据
id
或其他每行不同的列进行分组。但到目前为止,我已经完成了
分组(项目1、项目2、项目3[按什么排序])
。但是我如何对列列表进行排序并返回连接的排序列表呢?

结合@草莓的建议和我的“折叠”想法

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 |
+-------------------+-------+

虽然我不喜欢嵌套的子查询…

我还是从将三个
cart
列折叠成一列开始。@Tripkinetics-这就是我试图用
组concat
来完成的。不幸的是,我无法更改架构。但这并不是我想要的,因为这里有一个名为
item
的列与
cart\u no
关联,而在我的表中,每一行包含cart中的所有项目(
item1
item2
item3
)。由于我无法解释的原因,我知道购物车不会超过3个项目,所以我以这种方式存储数据。
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