假设我有一个包含两个表的数据库:categories
和articles
。每篇文章都属于一个类别。获取符合特定条件的类别中的最后一项
现在,我们假设我想要获取符合特定条件的每个类别的最新文章(请阅读文章)。如果不是那些额外的标准,我可以添加一个名为last_article_id
或类似于categories
表的列 - 尽管这样做不会被正确化。
但我该怎么做?我假设有一些使用GROUP BY
和HAVING
?
假设我有一个包含两个表的数据库:categories
和articles
。每篇文章都属于一个类别。获取符合特定条件的类别中的最后一项
现在,我们假设我想要获取符合特定条件的每个类别的最新文章(请阅读文章)。如果不是那些额外的标准,我可以添加一个名为last_article_id
或类似于categories
表的列 - 尽管这样做不会被正确化。
但我该怎么做?我假设有一些使用GROUP BY
和HAVING
?
尝试:
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
这与我的解决方案最接近,只是我在子查询中也添加了一些过滤器(当他们指的是文章时)。 – Franz 2010-05-07 19:41:21
如果您向我们提供的表模式,我们可以更具体一点,但你可以尝试像(12.2.9.6. EXISTS and NOT EXISTS,SELECT 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
)
假设ID在文章表代表总是越来越多,这应该工作。使用id在语义上不正确恕我直言,你应该实际使用时间/日期夯实领域,如果有的话。
SELECT * FROM articles WHERE article_id IN
(
SELECT
MAX(article_id)
FROM
articles
WHERE [your filters here]
GROUP BY
category_id
)
得到了一个时间戳。 – Franz 2010-04-26 18:26:57
有没有办法不用的子查询? – Franz 2010-04-26 18:28:21
查看http://jan.kneschke.de/projects/mysql/groupwise-max/ – goat 2010-04-26 18:37:26
@chris:那看起来很不错。 – Franz 2010-04-26 18:45:07