【问题标题】:Query concatenates everything into one row rather than into separate rows查询将所有内容连接到一行而不是单独的行
【发布时间】:2020-11-09 09:35:45
【问题描述】:

我有以下表格

Customer (driver_id is UNQIUE)
+--------+------+-----------+
| cus_id | name | driver_id |
+--------+------+-----------+
|      1 | bob  |      2342 |
|      2 | sam  |      2463 |
+--------+------+-----------+

Items (manufacture_product_id is UNIQUE) 
+---------+-------+-------------------------+
| item_id | name  | manufacturer_product_id |
+---------+-------+-------------------------+
|       1 | shirt |                    2131 |
|       2 | jeans |                     383 |
|       3 | pants |                       2 |
|       4 | watch |                   34634 |
|       5 | belt  |                       5 |
+---------+-------+-------------------------+

Outfits
+-----------+--------+---------------------+
| outfit_id | cus_id |    creation_date    |
+-----------+--------+---------------------+
|         1 |      2 | 2020-01-28 12:31:00 |
|         2 |      2 | 2020-01-29 15:23:12 |
+-----------+--------+---------------------+

items_in_outfit
+----------------+-----------+---------+
| outfit_item_id | outfit_id | item_id |
+----------------+-----------+---------+
|              1 |         1 |       2 |
|              2 |         1 |       3 |
|              3 |         1 |       5 |
|              4 |         2 |       1 |
|              5 |         2 |       2 |
|              5 |         2 |       3 |
|              6 |         2 |       5 |
+----------------+-----------+---------+

只是总结以上。 customer sam 有 2 套服装,分别是 outfit_id's 12。服装1 包含items_id's2,3,4。服装2 包含items_id's1,2,3,5

item_id's 是无用的数据位,但我需要它来保持主键完整性。我真正关心的是manufacturer_product_id。如何在manufacturer_product_id's 的串联字符串中选择所有cus_id=2's 服装。所以我的输出是:

+-----------+--------------------------+---------------------+
| outfit_id | manufacturer_product_str |    creation_date    |
+-----------+--------------------------+---------------------+
|         1 | 2,383,34634              | 2020-01-28 12:31:00 |
|         2 | 2,5,383,2131             | 2020-01-29 15:23:12 |
+-----------+--------------------------+---------------------+

但是我得到的输出是

+-----------+--------------------------+---------------------+
| outfit_id | manufacturer_product_ids |    creation_date    |
+-----------+--------------------------+---------------------+
|         1 | 2,2,5,383,383,2131,34634 | 2020-01-28 12:31:00 |
+-----------+--------------------------+---------------------+

这实质上是将所有outfit_id = 1outfit_id = 2 组合在一起。我希望每个 suit_id 都是分开的。

SELECT o.outfit_id, o.creation_date,
       GROUP_CONCAT(i.manufacturer_product_id ORDER BY i.manufacturer_product_id) as manufacturer_product_ids
FROM outfits o INNER JOIN
     items_in_outfit io
     ON o.outfit_id = io.outfit_id JOIN
     items i
     ON io.item_id = i.item_id JOIN
     customer c
     ON o.cus_id = c.cus_id 
WHERE c.driver_id = 2463
ORDER BY o.creation_date;

【问题讨论】:

    标签: mysql sql database select concatenation


    【解决方案1】:

    你需要添加group by子句

     SELECT o.outfit_id, o.creation_date,
               GROUP_CONCAT(i.manufacturer_product_id ORDER BY i.manufacturer_product_id) as manufacturer_product_ids,
               GROUP_CONCAT(i.manufacturer_product_id ORDER BY i.manufacturer_product_id SEPARATOR ';') as manufacturer_product_ids_sep
        FROM outfits o INNER JOIN
             items_in_outfit io
             ON o.outfit_id = io.outfit_id JOIN
             items i
             ON io.item_id = i.item_id JOIN
             customer c
             ON o.cus_id = c.cus_id 
        WHERE c.driver_id = 2463
        group by o.outfit_id,o.creation_date
        ORDER BY o.creation_date
    

    【讨论】:

    • 谢谢,这就是答案。一旦计时器允许我将标记为答案
    • @很高兴它帮助了你:)
    • 我可以再问一个问题,如果我想做同样的事情怎么办(但我想要在结果中用,分隔的一列和用;分隔的一列。所以它仍然是相同的逻辑,但只是不同的分隔符。我将如何以最有效的方式做到这一点?
    • @James,您可以使用 GROUP_CONCAT(yourcolumn SEPARATOR ';')
    • @James,我已经添加了专栏
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2013-06-01
    • 2013-09-23
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多