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