2013-03-19 345 views
0

我有一點點的查詢時,它是這樣的:MYSQL GROUP_CONCAT和IN

這是稍微複雜一點比它看起來,唯一的問題是使用一個子查詢的輸出參數爲IN子句生成另一個。它在某種程度上起作用 - 但它只提供「IN」子句中第一個id的結果。奇怪的是,如果我手動插入記錄ID「00003,00004,00005」它確實給出了正確的結果。

我想要做的是獲得第二層次多對多關係 - 基本上tour_stops有項目,而這些項目又有圖像。我試圖從所有項目的所有圖像作爲'item_images'在JSON字符串中。如上所述,它運行得很快,但只返回來自第一個相關項目的圖像。

SELECT DISTINCT 
    tour_stops.record_id, 
    (SELECT 
     GROUP_CONCAT(item.record_id) AS in_item_ids 
     FROM tour_stop_item 
     LEFT OUTER JOIN item 
     ON item.record_id = tour_stop_item.item_id 
     WHERE tour_stop_item.tour_stops_id = tour_stops.record_id 
     GROUP BY tour_stops.record_id 
     ) AS rel_items, 
    (SELECT 
     CONCAT('[ ', 
     GROUP_CONCAT(
     CONCAT('{ \"record_id\" : \"',record_id,'\", 
       \"photo_credit\" : \"',photo_credit,'\" }') 
     ) 
     ,' ]') 
     FROM images 
     WHERE 
     images.attached_to IN(rel_items) AND 
     images.attached_table = 'item' 
     ORDER BY img_order ASC) AS item_images 
    FROM tour_stops    
    WHERE 
    tour_stops.attached_to_tour = $record_id  
    ORDER BY tour_stops.stop_order ASC 

這兩個下面的答案我試過了,但它沒有幫助。第二個例子(將整個第一個子查詢放在他的「IN」語句中)不僅產生了我已經獲得的相同結果,而且還提高了查詢時間的指數級。

編輯:我代替我的語句

IN(SELECT item_id FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id) 

和它的作品,但現在卻慘遭慢。假設我有一切正確的索引,這是做到這一點的最好方法嗎?

using group_concat in PHPMYADMIN will show the result as [BLOB - 3B]

GROUP_CONCAT in IN Subquery

任何見解讚賞。謝謝

回答

1

我很驚訝你可以在子查詢中使用rel_items

您可以試試:

concat(',', images.attached_to, ',') like concat('%,', rel_items, ',%') and 

這可能是也可能不是更快。原來的版本很快,可能是因爲沒有匹配。

或者,您可以嘗試更改您的in子句。有時,這些優化很差:

exists (select 1 
     from tour_stop_item 
     where tour_stops_id = tour_stops.record_id and images.attached_to = item_id 
     ) 

然後確保你在tour_stop_item(tour_stops_id, item_id)有一個索引。

+0

這工作得很好。通過使用「獨特」索引,速度大大增加。謝謝。完全更改:SELECT GROUP_CONCAT(tour_stop_item.tour_stops_id)AS in_item_ids FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id GROUP BY tour_stops.record_id – dgig 2013-03-26 19:55:34