MySQL 5.5.36
阿帕奇2.2.15
CentOS的6.6
PHP 5.4.31

抱歉,标题太糟糕了,但这是我正在寻求帮助的内容;我有2个表,每个订单都有一行,而order_items有多个行。

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)


所需的最终结果完全与上表中所示的一样,但是我希望在可能的情况下将整个事情包含在单个查询中,而不是必须对显示的每个订单执行多个查询。

现在,在谷歌搜索了一段时间之后,我一直找不到真正想要做的事情。我查看了GROUP_CONCAT,但它仅将看起来像单个表中的列连接在一起。我想连接另一个表中的列,同时还要抓取找到的所有行。

我尝试的SQL是这样的:

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

最佳答案

我想,您可以用group_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;


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

09-10 10:23
查看更多