2010-04-26 32 views
1

假设我有一个包含两个表的数据库:categoriesarticles。每篇文章都属于一个类别。获取符合特定条件的类别中的最后一项

现在,我们假设我想要获取符合特定条件的每个类别的最新文章(请阅读文章)。如果不是那些额外的标准,我可以添加一个名为last_article_id或类似于categories表的列 - 尽管这样做不会被正确化。

但我该怎么做?我假设有一些使用GROUP BYHAVING

+0

有没有办法不用的子查询? – Franz 2010-04-26 18:28:21

+0

查看http://jan.kneschke.de/projects/mysql/groupwise-max/ – goat 2010-04-26 18:37:26

+0

@chris:那看起来很不错。 – Franz 2010-04-26 18:45:07

回答

1

尝试:

SELECT * 
    FROM categories AS c 
LEFT JOIN (SELECT * FROM articles ORDER BY id DESC) AS a 
     ON c.id = a.id_category 
     AND /criterias about joining/ 
    WHERE /more criterias/ 
GROUP BY c.id 
+0

这与我的解决方案最接近,只是我在子查询中也添加了一些过滤器(当他们指的是文章时)。 – Franz 2010-05-07 19:41:21

0

如果您向我们提供的表模式,我们可以更具体一点,但你可以尝试像(12.2.9.6. EXISTS and NOT EXISTSSELECT Syntax for LIMIT

SELECT * 
FROM articles a 
WHERE EXISTS ( 
        SELECT 1 
        FROM articles 
        where category_id = a.category_id 
        AND  <YourCriteria Here> 
        ORDER BY <Order Required : ID DESC, LastDate DESC or something? 
        LIMIT 1 
       ) 
0

假设ID在文章表代表总是越来越多,这应该工作。使用id在语义上不正确恕我直言,你应该实际使用时间/日期夯实领域,如果有的话。

SELECT * FROM articles WHERE article_id IN 
    (
    SELECT 
     MAX(article_id) 
    FROM 
     articles 
    WHERE [your filters here] 
    GROUP BY 
     category_id 
) 
+0

得到了一个时间戳。 – Franz 2010-04-26 18:26:57

相关问题