Mysql 是否可以将嵌套的select语句用作具有多行的列?

Mysql 是否可以将嵌套的select语句用作具有多行的列?,mysql,sql,Mysql,Sql,MySQL 5.5.36 Apache 2.2.15 CentOS 6.6 PHP 5.4.31 为这个糟糕的标题感到抱歉,但以下是我正在寻求帮助的内容;我有两个表,每个订单有一行,订单项有多行 order id | date | customer | status order_items id | order_id | item_id | item_name 我当前的代码在打开的订单中循环,然后执行一个辅助db调用,以获取项目并将其放入html表的一行中,如下所示: order_id |

MySQL 5.5.36 Apache 2.2.15 CentOS 6.6 PHP 5.4.31

为这个糟糕的标题感到抱歉,但以下是我正在寻求帮助的内容;我有两个表,每个订单有一行,订单项有多行

order
id | date | customer | status

order_items
id | order_id | item_id | item_name
我当前的代码在打开的订单中循环,然后执行一个辅助db调用,以获取项目并将其放入html表的一行中,如下所示:

order_id | date       | customer | status | item_name
1        | 2014-11-20 | 100233   | open   | widget a (item id 0004)
                                          | widget a (item id 0004)
2        | 2014-11-21 | 103327   | open   | widget c (item id 0005)
                                          | widget d (item id 0006)
select 
  o.id, o.date, o.customer, o.status, oi.id, 
  (select concat(item_name, ' (item id ', item_id, ')') from order_items where order_id = o.id) as 'item_list'
 from order o inner join order_items i on o.id = i.order_id 
 where o.status = 'open'
 order by date asc
所需的最终结果如上表所示,但如果可能的话,我希望在单个查询中获得整个结果,而不是必须对每个显示的订单执行多个查询

现在,在谷歌搜索了一段时间后,我还没有找到任何真正像我正在尝试做的事情。我查看了GROUP_CONCAT,但它只在一个表中连接列。我想连接另一个表中的列,同时也获取找到的所有行

我尝试的SQL如下所示:

order_id | date       | customer | status | item_name
1        | 2014-11-20 | 100233   | open   | widget a (item id 0004)
                                          | widget a (item id 0004)
2        | 2014-11-21 | 103327   | open   | widget c (item id 0005)
                                          | widget d (item id 0006)
select 
  o.id, o.date, o.customer, o.status, oi.id, 
  (select concat(item_name, ' (item id ', item_id, ')') from order_items where order_id = o.id) as 'item_list'
 from order o inner join order_items i on o.id = i.order_id 
 where o.status = 'open'
 order by date asc
那个嵌套的select语句是我无法理解的。那么,这可能吗

当我运行我的查询版本时,我得到:

Error Code: 1242
 Subquery returns more than 1 row   

你可以用
组来表达你想要的,我认为:

select o.id, o.date, o.customer, o.status,
       group_concat(i.item_name, ' (item id ', i.item_id, ')' separator '
') as item_list
from order o inner join
     order_items i
     on o.id = i.order_id 
where o.status = 'open'
group by o.id, o.date, o.customer, o.status
order by date asc;

我不完全理解您的数据布局,即项目在单独的行上。这个版本开始了一个新行,但更典型的是使用逗号或分号。

你可以用
group\u concat()表达你想要的内容,我认为:

select o.id, o.date, o.customer, o.status,
       group_concat(i.item_name, ' (item id ', i.item_id, ')' separator '
') as item_list
from order o inner join
     order_items i
     on o.id = i.order_id 
where o.status = 'open'
group by o.id, o.date, o.customer, o.status
order by date asc;

我不完全理解您的数据布局,即项目在单独的行上。这个版本开始了一个新行,但更典型的是使用逗号或分号。

你可以用
group\u concat()表达你想要的内容,我认为:

select o.id, o.date, o.customer, o.status,
       group_concat(i.item_name, ' (item id ', i.item_id, ')' separator '
') as item_list
from order o inner join
     order_items i
     on o.id = i.order_id 
where o.status = 'open'
group by o.id, o.date, o.customer, o.status
order by date asc;

我不完全理解您的数据布局,即项目在单独的行上。这个版本开始了一个新行,但更典型的是使用逗号或分号。

你可以用
group\u concat()表达你想要的内容,我认为:

select o.id, o.date, o.customer, o.status,
       group_concat(i.item_name, ' (item id ', i.item_id, ')' separator '
') as item_list
from order o inner join
     order_items i
     on o.id = i.order_id 
where o.status = 'open'
group by o.id, o.date, o.customer, o.status
order by date asc;

我不完全理解您的数据布局,即项目在单独的行上。这个版本开始一个新行,但更典型的是使用逗号或分号。

你想得太多了。由于您已经在
选择
中加入
,因此您获得的行数与
订单项目中的行数相同

在应用程序代码中,对结果集进行一次遍历(使用
mysqli_fetch_row()
或类似方法),将
order
项作为键收集到
order_项的
数组中(根据需要创建或添加到数组)。也就是说,重建表中的关系


然后对刚刚创建的贴图进行第二次遍历,并根据需要输出。如果您碰巧经常这样做,请看一下使用。您想得太多了。由于您已经在
选择
中加入
,因此您获得的行数与
订单项目中的行数相同

在应用程序代码中,对结果集进行一次遍历(使用
mysqli_fetch_row()
或类似方法),将
order
项作为键收集到
order_项的
数组中(根据需要创建或添加到数组)。也就是说,重建表中的关系


然后对刚刚创建的贴图进行第二次遍历,并根据需要输出。如果您碰巧经常这样做,请看一下使用。您想得太多了。由于您已经在
选择
中加入
,因此您获得的行数与
订单项目中的行数相同

在应用程序代码中,对结果集进行一次遍历(使用
mysqli_fetch_row()
或类似方法),将
order
项作为键收集到
order_项的
数组中(根据需要创建或添加到数组)。也就是说,重建表中的关系


然后对刚刚创建的贴图进行第二次遍历,并根据需要输出。如果您碰巧经常这样做,请看一下使用。您想得太多了。由于您已经在
选择
中加入
,因此您获得的行数与
订单项目中的行数相同

在应用程序代码中,对结果集进行一次遍历(使用
mysqli_fetch_row()
或类似方法),将
order
项作为键收集到
order_项的
数组中(根据需要创建或添加到数组)。也就是说,重建表中的关系


然后对刚刚创建的贴图进行第二次遍历,并根据需要输出。如果您碰巧经常这样做,请看一下使用。

感谢您实际回答问题的SQL部分。虽然我不认为在PHP web应用程序中修复SQL中订单项的布局是一件好事,但如前所述,组_concat只将单行的列的值作为新列进行concat。我想将多行添加到“item_list”列中,因此我只有订单信息和订单中所有项目的列表。这应该会将订单中的所有项目放在列中的一个分隔列表中。哇,在我能够正确使用语法后,这正是我要查找的。这正是我想要的。谢谢感谢您实际回答问题的SQL部分。虽然我不认为在PHP web应用程序中修复SQL中订单项的布局是一件好事,但如前所述,组_concat只将单行的列的值作为新列进行concat。我想将多行添加到“item_list”列中,因此我只有订单信息和订单中所有项目的列表。这应该将订单中的所有项目都放在列中的单个分隔列表中。哇,