mysql - 连接多列并在行内排序

标签 mysql sorting group-by concatenation group-concat

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

+------------------------------+
|  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])。但是如何对列列表进行排序并返回连接的排序列表?

最佳答案

结合@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/

相关文章:

mysql - CONCAT 行并在 GROUP 内返回

php - Laravel Group By 关系列

PHP + MySQL while() while() 只从数据库中删除第一个结果

php - 如何在mysql_query中添加变量

javascript - 将 backbone.js 同步到 php/MySQL

python - 如何按数字顺序对字典进行排序?

c - 排序 argv 插入随机数

java - 我面临这个问题 E/catch === : org. json.JSONException:SorrySignUpFirst 没有值

arrays - 对配对数字数组进行排序并删除重复或重叠?

sql-server - SQL Server 左连接