我有一个包含以下字段的表:
+------------------------------+
| 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
、towel
、paper
在示例表中出现过一次,ball
和 soap
出现了两次。
我认为我需要做的是对 item1
、item2
和 item3
进行排序,将它们连接起来,然后按连接值进行分组。所以 group_concat
听起来很棒,我可以按 id
或每行不同的其他列进行分组。但到目前为止,我有group_concat(item1, item2, item3 [ORDER BY WHAT])
。但是如何对列列表进行排序并返回连接的排序列表?
最佳答案
结合@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
尽管我不喜欢嵌套子查询...
关于mysql - 连接多列并在行内排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24042046/