2013-08-01 3 views
0

Это действительно 2 вопроса в одном, но я постараюсь сделать это как можно дольше.MySql пытается улучшить производительность запросов, но получил ошибку в столбце

Я показал свой первоначальный запрос другу, который сказал мне, что производительность может быть улучшена в дальнейшем с помощью sub select (с использованием MySql здесь).

К сожалению, я не мог получить его запрос на работу, так как я был Error Code: 1054 Unknown column 'e.id' in 'where clause'

Его запрос ниже: был бы признателен, если кто-то говорит мне, почему он не может распознать e.id.

SELECT e.id AS event_id, er.name AS event_name, er.revision AS revision, er.start_date AS event_dates 
FROM `events` AS e 
INNER JOIN 
(
    SELECT event_id, revision, start_date 
    FROM event_revisions 
    WHERE YEAR(start_date) = YEAR(CURDATE()) 
    AND revision = (
     SELECT MAX(er_tmp.revision) 
     FROM event_revisions AS er_tmp 
     WHERE er_tmp.approved = 1 
     AND e.id = er_tmp.event_id 
    ) 
) AS er ON (e.id = er.event_id) 
INNER JOIN member_events AS me ON (me.event_id = e.id) 
WHERE 
    e.enabled = 1 AND 
    e.deleted = 0 
GROUP BY event_id 
ORDER BY event_dates 

Это мой исходный запрос:

SELECT e.id AS event_id, er.name AS event_name, er.revision AS revision, er.start_date AS event_dates 
FROM `events` AS e 
INNER JOIN event_revisions AS er ON (e.id = er.event_id) 
INNER JOIN member_events AS me ON (me.event_id = e.id) 
WHERE 
    e.enabled = 1 AND 
    e.deleted = 0 AND 
    er.revision = (
     SELECT MAX(er_tmp.revision) 
     FROM event_revisions AS er_tmp 
     WHERE er_tmp.approved = 1 
     AND e.id = er_tmp.event_id 
    ) 
    AND YEAR(er.start_date) = YEAR(CURDATE()) 
GROUP BY event_id 
ORDER BY event_dates 

Второй вопрос: почему его запрос будет быстрее, чем у меня?

Любой ввод очень ценен.

+2

Попробуйте использовать кавычку (') для имен столбцов и таблиц. Также он не распознается, потому что «e.id» находится в другом запросе (он находится в подзапросе) – Dor

+0

hmm, поэтому я могу получить event_id из другого запроса? например 'event_revisions.event_id = er_tmp.event_id' –

+0

Я не думаю, что вы можете. Сначала выполняется самый глубокий подзапрос, чтобы создать временную таблицу, из которой данные могут быть извлечены родительскими запросами. – Dor

ответ

1

AD 1. Поскольку к югу выберите:

SELECT MAX(er_tmp.revision) 
    FROM event_revisions AS er_tmp 
    WHERE er_tmp.approved = 1 
    AND e.id = er_tmp.event_id 

это "называется" для каждой строки в вашем запросе годов.

(2 AD) и, как сказало Вам @Dor, Вы используете alaias из подзапроса

+0

Правильно, теперь это работало: производительность D была медленнее, чем моя, но моя: Время исполнения: 0.002 сек, его: Время исполнения: 1.058 сек. Любые идеи, почему такой большой differnece? –

Смежные вопросы