2014-12-01 23 views
0

MySQL的36年5月5日 的Apache 2.2.15 的CentOS 6.6 PHP 31年5月4日是否可以將嵌套的select語句用作具有多行的列?

很抱歉的可怕標題,但這裏是我要找的幫助;我有2個表,每個訂單都有一個單獨的行,而order_items有多個行。

order 
id | date | customer | status 

order_items 
id | order_id | item_id | item_name 

我當前的代碼是通過開放的訂單循環然後做一個二次分貝呼叫搶項目,並把它們放入一個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 

即嵌套查詢語句是什麼,我想不通。那麼,這可能嗎?

當我運行我的版本的查詢,我得到:

Error Code: 1242 
Subquery returns more than 1 row 

回答

3

可以詞組,你想用什麼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; 

我不完全理解你的數據佈局,在單獨的項目上有項目。此版本開始一個新行,但更通常使用逗號或分號。

+0

感謝您回答問題的SQL部分。雖然我不認爲在SQL Web應用程序中修復訂單項的佈局是一件好事。 – mabi 2014-12-01 23:04:05

+0

如上所述,group_concat僅將單行的列值連接爲新列。有多行我想添加到'item_list'列,所以我只是訂單信息加上一列中所有訂單項目的列表。 – tatorface 2014-12-02 00:22:42

+1

這應該將所有項目按順序放在列中的單個分隔列表中。 – 2014-12-02 02:30:23

0

你正在推翻這一點。由於您在SELECT中已經有JOIN,因此您可以獲得的行數與order_items中的行數相同。

在應用程序代碼,做一個傳過來的結果集(使用mysqli_fetch_row()或類似的),收集order的項目,如鑰匙進入order_itemsarray(創建或根據需要添加到陣列)。也就是說,重構你在桌上的關係。

然後在剛剛創建的地圖上進行第二遍掃描,並根據需要輸出。如果你碰巧經常這樣做,看看使用ORM mapper

+0

我想到了這一點。我想盡量重複使用儘可能多的代碼,而不必從頭開始重新創建。不幸的是,它可能是我所要做的,而不是僅僅替換查詢並刪除一些不需要的功能。謝謝! – tatorface 2014-12-02 00:23:58

+0

我所描述的實際上是最簡單的(也是最可取的)可能的事情,恕我直言。但要點是 - 堅持你的結果集,不需要你的第二個查詢/查詢。如果您擔心代碼重用,您可能已準備好引入Doctrine2或類似的ORM映射器。 – mabi 2014-12-02 12:51:33