2009-10-21 3 views
0

Я знаю, что есть несколько вопросов «Как найти самые последние записи» там, но ни одна из них не решила мою конкретную проблему: в 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

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

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 запросов, чтобы узнать, работает ли он или лучше.

+0

Я бы с удовольствием, но эта версия MySQL не разрешает оператор LIMIT в подзапросе. Должен был упомянуть об этом, извините. – Tom

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