У меня сложный 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
и
SELECT username FROM exp_members WHERE member_id=item_id
который я ожидал бы, чтобы объединить, чтобы имитировать количество повторений и загрузку сервера.
Есть ли способ сделать это? Любые советы?
UPD. структура таблицы следующая:
CREATE TABLE exp_favorites
(favorites_id
int (10) unsigned NOT NULL auto_increment, type
varchar (16) NOT NULL default 'entry_id', author_id
int (10) unsigned NOT NULL default '0', entry_id
int (10) unsigned NOT NULL, member_id
int (10) unsigned NOT NULL, site_id
smallint (3) unsigned NOT NULL default '1', entry_date
int (10) unsigned NOT NULL, notes
текст NOT NULL, public
char (1) NOT NULL default 'y',
ПЕРВИЧНЫЙ КЛЮЧ (favorites_id
),
КЛЮЧ author_id
(author_id
),
КЛЮЧ entry_id
(entry_id
),
КЛЮЧ member_id
(member_id
),
КЛЮЧ site_id
(site_id
),
КЛЮЧ public
(public
),
КЛЮЧ type
(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