2011-10-04 27 views
1

我有這個疑問:的MySQL返回在單個列多行值

SELECT 
    s.id AS id, 
    s.item_id, 
    i.type_id AS type_id, 
    i.description AS description, 
    i.owner_id, 
    s.buyer_id, 
    i.receivedate, 
    i.statusdate, 
    i.baseprice, 
    i.salepercentage, 
    i.status_id, 
    s.posteddate, 
    s.closingdate, 
    s.discountdate, 
    s.discountrate, 
    t.description AS type_description, 
    st.description AS status_description 
FROM 
    sale s 
LEFT JOIN item i ON s.item_id=i.id 
LEFT JOIN TYPE t ON i.type_id=t.id 
LEFT JOIN STATUS st ON i.status_id=st.id 
WHERE s.flag_id != 2 
GROUP BY s.id 
ORDER BY s.closingdate; 

它工作正常,但作爲最後一步,我需要在級聯名字和姓氏字段拉從另一個表稱爲customer對於均爲i.owner_ids.buyer_id字段。

我已經得到接近使用下列內容:

SELECT 
    s.id AS id, 
    s.item_id, 
    i.type_id AS type_id, 
    i.description AS description, 
    i.owner_id, 
    s.buyer_id, 
    i.receivedate, 
    i.statusdate, 
    i.baseprice, 
    i.salepercentage, 
    i.status_id, 
    s.posteddate, 
    s.closingdate, 
    s.discountdate, 
    s.discountrate, 
    t.description AS type_description, 
    st.description AS status_description, 
    GROUP_CONCAT(CONCAT(c.firstname, ' ', c.lastname) ORDER BY i.owner_id, s.buyer_id) 
FROM 
    sale s 
LEFT JOIN item i ON s.item_id=i.id 
LEFT JOIN TYPE t ON i.type_id=t.id 
LEFT JOIN STATUS st ON i.status_id=st.id 
LEFT JOIN CUSTOMER c ON i.owner_id=c.id OR s.buyer_id=c.id 
WHERE s.flag_id != 2 
GROUP BY s.id 
ORDER BY s.closingdate; 

當我使用的條目在客戶表像它測試以下:

id=3, firstname="John", lastname="Doe" 
id=10, firstname="Jane", lastname="Do" 

以及出售表格中的項目有:

owner_id=3, buyer_id=10 
owner_id=10, buyer_id=3 

GROUP_CONCAT()列返回

Jane Do,John Doe 
Jane Do,John Doe 

我也沒辦法的知道哪個是所有者,哪個是純粹的買方關閉逗號分隔的位置,我希望的結果是

John Doe,Jane Do 
Jane Do,John Doe 

出售的物品。

是否可以確保返回將有一個控制順序返回GROUP_CONCAT()列表中的結果集(即第一個客戶將與owner_id和第二個顧客與buyer_id相關的)?

回答

3

我建議加入顧客表兩次。一次爲買家,一次爲業主:

SELECT ... 
    GROUP_CONCAT(CONCAT(buyer.firstname, ' ', buyer.lastname) AS buyers, 
    GROUP_CONCAT(CONCAT(owner.firstname, ' ', owner.lastname) AS owners 
... 
LEFT JOIN customer AS buyer ON s.buyer_id=buyer.id 
LEFT JOIN customer AS owner ON i.owner_id=owner.id 

如果您需要將數據保持分開,請保持分開。

+0

+1,打我吧。 – Johan

+0

這是'LEFT JOIN客戶AS買家ON ** s.buyer_id ** = buyer.id' –

+0

@ypercube:謝謝,修復答案。 –

1

問題是,你在混合業主和買家。
只需單獨加入;
只要您爲每個實例使用不同的別名,在同一個表上連接兩次就沒有問題。

SELECT 
    s.id AS id, s.item_id 
    , i.type_id AS type_id, i.description AS description, i.owner_id 
    , s.buyer_id 
    , i.receivedate, i.statusdate, i.baseprice, i.salepercentage, i.status_id 
    , s.posteddate, s.closingdate, s.discountdate, s.discountrate 
    , t.description AS type_description 
    , st.description AS status_description 
    , GROUP_CONCAT(
     CONCAT(co.firstname, ' ', co.lastname,',',cb.firstname,' ',cb.lastname) 
     ORDER BY co.id,cb.id) as first_owner_than_buyer 
FROM sale s 
LEFT JOIN item i ON s.item_id=i.id 
LEFT JOIN TYPE t ON i.type_id=t.id 
LEFT JOIN STATUS st ON i.status_id=st.id 
LEFT JOIN CUSTOMER co ON (i.owner_id=co.id) 
LEFT JOIN CUSTOMER cb ON (s.buyer_id=cb.id) 
WHERE s.flag_id != 2 
GROUP BY s.id 
ORDER BY s.closingdate; 
相關問題