将多个子行组合成一行MySQL

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

提前谢了,我就是不明白!

我有两张桌子

有序_项目

ID | Item_Name
1  | Pizza
2  | Stromboli

有序_备选方案

Ordered_Item_ID | Option_Number | Value
        1               43         Pepperoni
        1               44         Extra Cheese
        2               44         Extra Cheese

我想要输出的是MySQL查询。

输出量

ID | Item_Name | Option_1 | Option_2
1    Pizza       Pepperoni  Extra Cheese
2    Stromboli     NULL     Extra Cheese

我尝试过许多选项--大多数以语法错误结尾,我尝试过组。_但这并不是我想要的。下面我有一个粗略的例子,说明我认为可能是一个开始。每次我都需要选择的顺序是一样的。而在收集信息的程序中,没有办法可靠地确保这将发生。是否可以根据选项号进行连接。另外,我知道我永远不会有超过5个选项,所以静态解决方案会起作用。

Select Ordered_Items.ID,
    Ordered_Items.Item_Name,
FROM Ordered_Items
    JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 43) as Option_1 
        ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID
    JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 44) as Option_2 
        ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID;

提问于
用户回答回答于

我很感谢你的帮助,我想我已经找到了一个解决办法,如果有人能对我的有效性发表评论的话,我会很感激的。本质上我所做的就是。我意识到它的实现有点静态,但是我做了我需要它做的事情(原谅不正确的语法)。

SELECT
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  Options1.Value
  Options2.Value
FROM ORDERED_ITEMS
LEFT JOIN (Ordered_Options as Options1)
    ON (Options1.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID 
        AND Options1.Option_Number = 43)
LEFT JOIN (Ordered_Options as Options2)
    ON (Options2.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID
        AND Options2.Option_Number = 44);
用户回答回答于

最简单的方法就是利用这个小组_这里的群函数..。

select
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  GROUP_CONCAT(Ordered_Options.Value) as `Options`
from
  ordered_item,
  ordered_options
where
  ordered_item.id=ordered_options.ordered_item_id
group by
  ordered_item.id

它的产出:

Id              ItemName       Options

1               Pizza          Pepperoni,Extra Cheese

2               Stromboli      Extra Cheese

这样,就可以拥有任意多的选项,而不必修改查询。

啊,如果你看到你的结果被裁剪了,你可以增加组的大小限制。_像这样:

SET SESSION group_concat_max_len = 8192;

扫码关注云+社区