2013-11-12 3 views
1

У меня есть три стола.ВЫБЕРИТЕ все записи, но самые высокие

Page       Revision         Text      
+-----------+-------------+ +-----------+-------------+----------+  +-------------+---------+ 
| page_id | rev_id  | | rev _id | rev_text_id | page_id |  | rev_text_id | text | 
+-----------+-------------+ +-----------+-------------+----------+  +-------------+---------+ 
|  1 |  2  | |  1 |  1  | 1  |  |  1  |  A | 
+-------------------------- +------------------------------------+  +-----------------------+ 
|  2 |  5  | |  2 |  2  | 1  |  |  2  |  B | 
+-------------------------+ +------------------------------------+  +-----------------------+ 
           |  3 |  3  | 2  |  |  3  |  C | 
           +------------------------------------+  +-----------------------+ 
           |  4 |  4  | 2  |  |  4  |  D | 
           +------------------------------------+  +-----------------------+ 
           |  5 |  4  | 2  |    
           +------------------------------------+    

Мой желаемый результат:

+--------+-------------+ 
| rev_id | rev_text_id | 
+--------+-------------+ 
| 1 |  1  | 
+----------------------+ 
| 3 |  3  | 
+----------------------+ 
| 4 |    | 
+----------------------+ 

Моя цель состоит в том, чтобы найти rev_id-х и rev_text_id, которые могут быть удалены из каждой таблицы в одном запросе. Поскольку таблица ревизий может содержать равные rev_text_id для нескольких изменений, мне нужно исключить rev_text_id, который является самым высоким для каждой страницы (в примере 4 на стр. 2).

я начал баловаться вдоль линий:

SELECT 
r.rev_id,r.rev_text_id 
FROM revision r, page p, text t 
WHERE p.page_id = r.page_id 
AND t.rev_text_id = r.rev_text_id 
AND p.rev_id != r.rev_id 
AND r.rev_text_id not in (
     SELECT max(r.rev_text_id) 
     FROM revision AS r, page AS p 
     WHERE r.rev_id = p.rev_id 
); 

Но скачет рекорд rev_id 4 в моем желаемый результат и не включает в себя «нулевые дела» ..

+0

Пожалуйста, покажите текущий запрос SQL –

+0

Рассмотрите возможность создания sqlfiddle одного и того же, и, ради удобства каждого, рассмотрите возможность переименования столбцов на 'rev_id',' page_id' и 'rev_text_id'. – Strawberry

+0

Переименован и возился. –

ответ

0

Попробуйте это:

SELECT r.`rev_id`, r.`rev_text_id` 
FROM `Revision` AS r 
WHERE r.`rev_text_id` NOT IN (SELECT r.`rev_text_id` 
           FROM `Revision` AS r, `Page` AS p 
           WHERE r.`rev_id` = p.`page_latest`;) 
ORDER BY r.`rev_id`; 

в основном это захватывает rev_id о том, что равные по page_latest, находит rev_text_id ассоциируется с этими rev_id годов, и использует эти rev_text_id в качестве фильтра.

+0

Этот запрос не возвращает rev_id 4, правильно, поскольку вы отфильтровываете те версии, которые имеют тот же rev_id, что и page_latest. Вывод, который я хочу, включает rev_id 4 без привязки rev_text_id на выходе. Думаю, это нужно получить, используя соединение? –

+0

Я не знаю, есть ли способ сделать это в чистом SQL. Я не знаю, как можно выделить ячейки в такой последовательности. Возможно, вам придется обработать это на PHP после запроса. – zsaat14

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