2013-04-04 79 views
0

這個SQL查詢讓我難以理解如何去做。mysql query left join or group_concat or?

我有以下2個MySQL表:

[items] 
     id 
     title 

    [ledger] 
     id 
     itemid 
     qty 
     stockcode 

我從[項目]表進行選擇其中id = 123.I也想返回的一個「額外」列在items.id = ledger.itemid上匹配的結果集,它是SUM(qty)> 0的[分類帳]代碼的逗號分隔列表。這個總和反映了一個項目可能有分類賬項目顯示數量爲+5和-2圖像=總共3個圖像。這3幅圖像將在extras欄中反映爲「圖像,圖像,圖像」。

select 
     id 
     ,title 
     ,???? as extras 
    from 
     items 
    where 
     items.id = 123 

的 '演員' 列一個例子的結果可能是:

bold,highlight,border,image,image,image 

反映結果從總帳表總和(數量)> 0

bold (1) 
    highlight (1) 
    border (1) 
    image (3) 

回答

0

你可能想要做一個LEFT JOINGROUP_CONCATHAVING得到你正在尋找的信息:

SELECT i.id, i.title, GROUP_CONCAT(l.stockcode SEPARATOR ',') extras 
FROM items i 
LEFT JOIN ledger l ON i.id = l.itemid 
WHERE i.id = 123 
HAVING SUM(l.qty) > 0 

看到這個SQL Fiddle

0

嘗試像

SELECT id, title, extras 
FROM items 
JOIN (
    SELECT itemsid, GROUP_CONCAT(stockcode SEPERATOR ',') extras 
    FROM ledger 
    GROUP BY itemsid 
    HAVING SUM(qty) > 0 
) t ON t.itemsid = items.id 
WHERE id=123 
+0

我看了做這種方式,但擔心對整個分類帳表中的子查詢(可能是巨大的),可能會導致在性能問題上走下坡路? – regan 2013-04-04 21:43:52

+0

有時你只需要做你必須做的事情。如果性能成爲一個問題,那麼你可能要考慮創建一個[物化視圖](http://en.wikipedia.org/wiki/Materialized_view)的GROUP_CONCAT查詢,並用它代替 – 2013-04-04 21:49:19

+0

我已經發布了另一個關於使用用戶定義的變量在子查詢中 - 不知道沿着這些行的東西是否會提供另一個可能的解決方案(我以前沒有真正使用它們,所以不知道限制) - http://stackoverflow.com/questions/15823288/設置一個MySQL的用戶變量的每行 – regan 2013-04-04 23:14:57