【问题标题】:MySQL : Multiple row as comma separated single rowMySQL:多行作为逗号分隔的单行
【发布时间】:2010-08-16 11:04:58
【问题描述】:

我有两个表:DISH 和 DISH_HAS_DISHES。 Dish 表包含所有菜肴,“Dish_has_dishes”表与“Dish”表具有一对多的关系。 IE。一道菜可以有多道菜。例如

dish_id   dish_name
1         dish_1
2         dish_2
3         dish_3
4         dish_4

DISH_HAS_DISHES

meal_id   dish_id
1         2
1         3
1         4

这里的meal_id 和dish_id 都是DISH 表中的ID。现在我想要这样的格式:

meal_id     dish_ids     dish_names
1           2,3,4        dish_2, dish_3, dish_4

这是每餐的逗号分隔的菜品 ID 和名称。该怎么做?

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    使用 GROUP_CONCAT 函数

    http://dev.mysql.com/tech-resources/articles/4.1/grab-bag.html

     SELEct m.meal_Id, 
            GROUP_CONCAT(dish_id) dish_ids, 
            GROUP_CONCAT(dish_name) dish_names
     FROM DISH_HAS_DISHES m JOIN DISH d ON (m.dish_id = d.dish_id)
     GROUP BY meal_Id
    

    【讨论】:

    • 太棒了。比你迈克尔的快速回复。只需要问一件事,我将“dish_ids”列作为“BLOB”类型。休息适当。为什么?
    • @Swar,应该是 varchar,dish_ids 的长度是多少?也看看这个dev.mysql.com/doc/refman/5.0/en/…。检查参数 group_concat_max_len 的值,默认如果结果字符串超过 512 个字符(默认值),则返回为 BLOB
    • 它们只是长度为 11 的整数。我只测试了 4 个 id - 6,7,8 和 9。虽然使用 blob 类型,但它工作得很好,但只是一个查询。
    • @Swar,很奇怪。在 doc 中:返回值是非二进制还是二进制字符串,具体取决于参数是非二进制还是二进制字符串。结果类型为 TEXT 或 BLOB,除非 group_concat_max_len 小于或等于 512,在这种情况下,结果类型为 VARCHAR 或 VARBINARY。 (在 MySQL 5.0.19 之前,仅当查询包含 ORDER BY 子句时,GROUP_CONCAT() 返回的 TEXT 或 BLOB group_concat_max_len 大于 512。)
    • 谢谢@MichaelPakhantsov,你节省了我很多时间,真的很感激。
    猜你喜欢
    • 2021-10-12
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2021-08-31
    • 2017-01-24
    • 2018-11-02
    相关资源
    最近更新 更多