将多个子行组合成一行MYSQL

65 mysql select join

在此先感谢,我似乎无法得到它!

我有两张桌子

Ordered_Item

ID | Item_Name
1  | Pizza
2  | Stromboli

Ordered_Options

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

我尝试了很多以语法错误结尾的选项,我尝试过group_concat,但那并不是我想要的.我在下面有一个粗略的例子,我认为可能是一个开始.我每次都需要选项以相同的顺序.在收集信息的程序中,没有办法可靠地确保会发生这种情况.是否可以根据选项号将它们连接起来.此外,我知道我将永远不会有超过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;
Run Code Online (Sandbox Code Playgroud)

谢谢!乔

Wou*_*ick 109

最简单的方法是在这里使用GROUP_CONCAT组功能.

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
Run Code Online (Sandbox Code Playgroud)

哪个会输出:

Id              ItemName       Options

1               Pizza          Pepperoni,Extra Cheese

2               Stromboli      Extra Cheese
Run Code Online (Sandbox Code Playgroud)

这样,您可以拥有任意数量的选项,而无需修改查询.

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

SET SESSION group_concat_max_len = 8192;
Run Code Online (Sandbox Code Playgroud)

  • 要对组内的项目进行排序,可以执行以下操作:GROUP_CONCAT(Ordered_Options.Value ORDER BY Ordered_Options.value), (4认同)
  • 他说:"我尝试过group_concat,但那不是我想要的." (3认同)

小智 11

我很感激帮助,我认为如果有人评论我会感激的有效性,我会找到解决方案.基本上我做的是.我意识到它的实现有点静态,但我做了我需要它做的事情(原谅不正确的语法)

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);
Run Code Online (Sandbox Code Playgroud)

  • 这很难维持.您的客户迟早会想要第3或第4选项,到那时您需要重写所有内容. (6认同)

Wou*_*ick 6

如果您的结果中确实需要多列,并且选项数量有限,您甚至可以这样做:

select
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  if(ordered_options.id=1,Ordered_Options.Value,null) as `Option1`,
  if(ordered_options.id=2,Ordered_Options.Value,null) as `Option2`,
  if(ordered_options.id=43,Ordered_Options.Value,null) as `Option43`,
  if(ordered_options.id=44,Ordered_Options.Value,null) as `Option44`,
  GROUP_CONCAT(if(ordered_options.id not in (1,2,43,44),Ordered_Options.Value,null)) as `OtherOptions`
from
  ordered_item,
  ordered_options
where
  ordered_item.id=ordered_options.ordered_item_id
group by
  ordered_item.id
Run Code Online (Sandbox Code Playgroud)