Найти самую последнюю запись для пересечения категорий - PullRequest
0 голосов
/ 22 октября 2009

Я знаю, что есть ряд вопросов «Как найти самую последнюю запись», но ни один из них не решил мою конкретную проблему: в MySQL я пытаюсь найти самую последнюю запись для записи это сопоставлено с двумя различными категориями в одной таблице. По сути, есть таблица ENTRIES с кучей информации, таблица CATEGORIES (id, name) и таблица ENTRY_CATEGORIES (entry_id, category_id). Мне нужно найти самую последнюю запись, которая сопоставлена ​​с двумя различными категориями. Мне удалось это сделать, но только по сути, присоединив производную таблицу к себе, и мне кажется, что есть более чистый способ сделать это. Как мне лучше выразить следующий беспорядок:

SELECT doc.entry_id
FROM exp_category_posts doc 
INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id
WHERE doc.cat_id = 408 
AND fund.cat_id = 548 
AND t.entry_date = (SELECT MAX(t.entry_date)
FROM exp_category_posts doc 
INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id
WHERE doc.cat_id = 408 
AND fund.cat_id = 548)

Это жестко запрограммированный пример, где 408 и 548 также обычно являются полями. Это база данных Expression Engine, если вам интересно.

1 Ответ

1 голос
/ 22 октября 2009

Вы можете попробовать заменить

AND t.entry_date = (SELECT MAX(t.entry_date)
FROM exp_category_posts doc 
INNER JOIN exp_category_posts fund ON doc.entry_id = fund.entry_id 
INNER JOIN exp_weblog_titles t ON doc.entry_id = t.entry_id
WHERE doc.cat_id = 408 
AND fund.cat_id = 548)

с:

ORDER BY t.entry_date DESC
LIMIT 1

Оптимизатор, вероятно, в конце концов получит аналогичный запрос (конечно, это не гарантировано, но вполне вероятно), но запрос вдвое длиннее. Вам нужно будет выполнить explain и профилировать несколько select запросов, чтобы увидеть, работает ли он так же или лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...