2013-06-15 3 views
2

Надеюсь, вы можете помочь. Я хранение данных в базе данных MySQL в следующем формате:Выбор строк по критериям других строк

ArticlePK ArticleId Status  Title    lastupdate 
1   1   Draft  Peter Pan   2013-06-14 07:24:05 
2   1   Published Peter Pan   2013-06-15 08:00:05 
3   1   Deleted  Peter Pan   2013-06-20 11:30:12 
4   2   Published Growth of the Soul 2013-06-14 07:24:05 

Мне нужен SQL запрос, который:

  • возвращает все строки со статусом Publish
  • КРОМЕ если позже ряд (определяется столбцом lastUpdate), с тем же ArticleId, имеет статус удаленной.

Таким образом, в следующем примере, запрос должен возвращать только строку с ArticlePK из 4. Ряд ArticlePK 2 не будет возвращаться из-за строки с ArticlePK 3.

Я пробовал несколько вещей, но ничего не получилось. Я уверен, что это только подтолкнет, чтобы помочь мне, поэтому, если у вас есть какие-либо предложения, я бы хотел их услышать.

Спасибо,

ответ

3

Вы можете использовать NOT EXISTS

SELECT articlepk, articleid, status, title, lastupdate 
FROM tablename t1 
WHERE status = 'Published' 
     AND NOT EXISTS (SELECT 1 FROM tablename t2 
         WHERE t1.articleid = t2.articleid 
         AND t2.status = 'Deleted' 
         AND t2.lastupdate > t1.lastupdate) 

DEMO

+0

+1 выдержка для SQLFiddle - Я даже не знаю, существует этот сайт. Я собираюсь попробовать эти ответы более подробно завтра утром в MySQL, поскольку у него, казалось, были некоторые проблемы с NOT EXISTS, когда я попробовал это раньше сегодня. – JonRed

2
SELECT a.* 
FROM table1 a 
LEFT JOIN table1 b ON (b.ArticleId = a.ArticleId and b.Status ='Deleted' and 
b.lastupdate > a.lastupdate) 
WHERE a.Status='Published' and b.ArticlePK IS NULL 
Смежные вопросы