需要帮助优化MySQL查询吗

需要帮助优化MySQL查询吗,sql,mysql,query-optimization,Sql,Mysql,Query Optimization,我有一个复杂的SQL查询,其中包含要优化的嵌套“子查询” SELECT 'likes' `type`, entry_date item_date, CASE `type` WHEN 'entry_id' THEN entry_id WHEN 'member_id' THEN f.member_id WHEN 'topic_id' THEN entry_id END AS item_id, CASE `type` WHEN 'entry_id' TH

我有一个复杂的SQL查询,其中包含要优化的嵌套“子查询”

    SELECT
'likes' `type`,
entry_date item_date,
CASE `type`
    WHEN 'entry_id' THEN entry_id
    WHEN 'member_id' THEN f.member_id
    WHEN 'topic_id' THEN entry_id
END    
AS item_id,
CASE `type`
    WHEN 'entry_id' THEN (SELECT title FROM exp_weblog_titles WHERE entry_id=item_id)
    WHEN 'member_id' THEN (SELECT screen_name FROM exp_members WHERE member_id=item_id)
    WHEN 'topic_id' THEN (SELECT title FROM exp_forum_topics WHERE topic_id=item_id)
END    
AS item_title,
CASE `type`
    WHEN 'member_id' THEN (SELECT username FROM exp_members WHERE member_id=item_id)
    ELSE ''
END    
AS  item_url_title,
f.type parent_type,
CASE `type`
    WHEN 'entry_id' THEN (SELECT weblog_id FROM exp_weblog_titles WHERE entry_id=item_id)
    WHEN 'member_id' THEN ''
    WHEN 'topic_id' THEN (SELECT forum_id FROM exp_forum_topics WHERE topic_id=item_id)
END    
AS parent_id,
CASE `type`
    WHEN 'entry_id' THEN ''
    WHEN 'member_id' THEN ''
    WHEN 'topic_id' THEN (SELECT forum_name FROM exp_forums WHERE forum_id=parent_id)
END    
AS parent_title,         
m.member_id actor_member_id,
screen_name actor_screen_name,
username actor_username,
photo_filename actor_photo,
avatar_filename actor_avatar
FROM exp_favorites f, exp_members m
WHERE f.member_id=m.member_id
正如您所注意到的,在子查询中,某些表会针对同一行但不同的字段进行多次查询。
比如,我有

SELECT screen_name FROM exp_members WHERE member_id=item_id  

我希望这两种方法能够结合起来,以模拟reuest的数量和服务器负载

有办法做到这一点吗?有什么建议吗

UPD。表结构如下:
创建表
exp\u收藏夹

favorites\u id
int(10)无符号非空自动增量,
type
varchar(16)不为空默认“条目id”,
author\u id
int(10)无符号非空默认值“0”,
entry\u id
int(10)无符号非空,
member\u id
int(10)无符号非空,
site\u id
smallint(3)无符号非空默认值“1”,
entry\u date
int(10)无符号非空,
注释
文本不为空,
public
char(1)不为空默认值为“y”,
主键(
favorites\u id
),
作者id
作者id
),
entry\u id
entry\u id
),
成员id
成员id
),
站点id
站点id
),
public
public
),
类型
类型


)

您可以这样做:

SELECT
'likes' `type`,
entry_date item_date,
CASE `type`
    WHEN 'entry_id' THEN entry_id
    WHEN 'member_id' THEN f.member_id
    WHEN 'topic_id' THEN entry_id
END    
AS item_id,
CASE `type`
    WHEN 'entry_id' THEN wt.title
    WHEN 'member_id' THEN m2.screen_name
    WHEN 'topic_id' THEN ft.title
END    
AS item_title,
...
FROM exp_favorites f
inner join exp_members m ON f.member_id=m.member_id
left outer join exp_weblog_titles wt on wt.entry_id=f.item_id
left outer join exp_members m2 on m2.entry_id=f.item_id
left outer join exp_forum_topics ft on ft.entry_id=f.item_id

你能把你的桌子结构贴在这里吗?你的数据库正常化了吗?用表结构信息更新了帖子。我对规范化不太了解,但在我看来它是规范化的。它看起来不像选项,因为f.item_id可以与3个表中的任何一个表中的记录关联,因此连接将变得非常巨大。还是我错了?@runner:看看最后三个表联接中的联接条件-它们都是从f.item_id到每个表中相应的字段。@RedFilter,我认为需要调整几个左联接-exp_成员只在成员_id上联接,所以不需要m2,虽然论坛主题加入了主题id和家长id,但没有条目id。@马克:是的,可能有很多不准确的地方;在没有看到完整的模式的情况下,我不会在这方面花费更多的时间-我认为这个概念已经足够清楚了。问题是f.item_id可以引用3个表中的任意一个表中的行(我使用“type”字段来确定需要使用哪些数据)。所以我认为这里的连接可能会增长得非常快。无论如何,我会尝试这个解决方案,看看它是否比我使用的更好。
SELECT
'likes' `type`,
entry_date item_date,
CASE `type`
    WHEN 'entry_id' THEN entry_id
    WHEN 'member_id' THEN f.member_id
    WHEN 'topic_id' THEN entry_id
END    
AS item_id,
CASE `type`
    WHEN 'entry_id' THEN wt.title
    WHEN 'member_id' THEN m2.screen_name
    WHEN 'topic_id' THEN ft.title
END    
AS item_title,
...
FROM exp_favorites f
inner join exp_members m ON f.member_id=m.member_id
left outer join exp_weblog_titles wt on wt.entry_id=f.item_id
left outer join exp_members m2 on m2.entry_id=f.item_id
left outer join exp_forum_topics ft on ft.entry_id=f.item_id