2012-12-18 150 views
0

經過多次傳遞後,我想知道是否有可能進一步優化此查詢?任何見解都非常感謝。除了必須使用一堆不理想的子查詢之外,我必須使用其中一個兩次,因爲'標記'引用不能用在where子句中......(一直未能弄清楚如何重寫此爲連接,以解決)Mysql子查詢優化 - 如何減少/刪除子查詢

SELECT `t1`.*, 
(SELECT GROUP_CONCAT(tag_id) FROM media_tag WHERE media_id=t1.id GROUP BY media_id) as tags, 
(SELECT GROUP_CONCAT(award_id) FROM media_award WHERE media_id=t1.id GROUP BY media_id) as awards, 
(SELECT GROUP_CONCAT(client_id) FROM media_client WHERE media_id=t1.id GROUP BY media_id) as clients, 
(SELECT GROUP_CONCAT(collaborator_id) FROM media_collaborator t2 LEFT JOIN collaborator t3 ON t2.collaborator_id=t3.id WHERE media_id=t1.id AND t3.collaborator_type_id='1' GROUP BY media_id) as agencies, 
(SELECT GROUP_CONCAT(collaborator_id) FROM media_collaborator t2 LEFT JOIN collaborator t3 ON t2.collaborator_id=t3.id WHERE media_id=t1.id AND t3.collaborator_type_id<>'1' GROUP BY media_id) as collaborators, 
`t2`.`idx`, `t2`.`type` 
FROM (`media` t1) 
LEFT JOIN `sort` t2 ON `t1`.`id`=`t2`.`id` AND t2.type="media" 
WHERE 
    FIND_IN_SET('1',(SELECT GROUP_CONCAT(tag_id) FROM media_tag WHERE media_id=t1.id GROUP BY media_id)) 
    AND IF(t2.tag_id IS NOT NULL,t2.tag_id='1',1) 
GROUP BY `t1`.`id` 
ORDER BY `t1`.`date_mod` DESC, `title` ASC, `t2`.`idx` ASC, `date_mod` DESC, `title` ASC 
+0

我可能會把它扔掉。重新思考正在努力實現的目標。正如你還沒有告訴我們,將很難給出明智的答案 –

+0

我有一個'媒體'記錄的主要集合。每個子查詢都拉入生活在不同表格中的索引屬性。屬性表具有(id,media_id,name)模式。我們的目標是查詢主要媒體文件,能夠將屬性聚合成逗號分隔的列表,然後abe能夠對任何一個屬性列表中的給定值進行過濾 – Funkmyer

+0

我很好奇如果有更好的方法來設置這種數據格式的模式? – Funkmyer

回答

2

,你應該儘量減少爲每一行選擇語句,您可以加入該行和組由一些標識符,它會更好,如果你可以發佈你的表結構和告訴我們你想從他們那裏得到什麼信息...

+0

...然後重新思考一個更好的解決方案 –

+0

我有一個主要的'媒體'記錄表。我有不同的屬性類型(ID,名稱)單獨的表,我有一個表,將任何屬性映射到媒體記錄(attribute_id,media_id)。想要使用聚集的屬性列表查詢「媒體」記錄並能夠過濾特定的屬性。根據我的知識,我使用的結構是有道理的,但我想知道這種數據格式是否有更智能的表結構? – Funkmyer