2012-12-18 177 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