假設我有一個包含兩個表的數據庫: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