所需的方法是,首先找到每篇文章的最新評論日期:
SELECT aid, MAX(Date) AS Date
FROM Comments
GROUP BY aid;
然後,您可以把這個邏輯的子查詢中,並使用aid
和date
讓所有的領域攜手回評論:
SELECT c.*
FROM Comments AS c
INNER JOIN
( SELECT aid, MAX(Date) AS Date
FROM Comments
GROUP BY aid
) AS mc
ON mc.aid = c.aid
AND mc.Date = c.Date;
然後,您可以將連接添加到您的文章表。如果所有的文章有意見,或者你只是想與評論文章,那麼你可以使用:
SELECT *
FROM Articles AS a
INNER JOIN Comments AS c
ON c.Aid = a.aid
INNER JOIN
( SELECT aid, MAX(Date) AS Date
FROM Comments
GROUP BY aid
) AS mc
ON mc.aid = c.aid
AND mc.Date = c.Date;
如果沒有,你將需要使用LEFT用括號JOIN,以確保在子查詢INNER JOIN
不會刪除不包含項目評論:
SELECT *
FROM Articles AS a
LEFT JOIN (Comments AS c
INNER JOIN
( SELECT aid, MAX(Date) AS Date
FROM Comments
GROUP BY aid
) AS mc
ON mc.aid = c.aid
AND mc.Date = c.Date)
ON c.Aid = a.aid;
Example on SQL Fiddle
這真的只是爲速記:
SELECT *
FROM Articles AS a
LEFT JOIN
( SELECT c.*
FROM Comments AS c
INNER JOIN
( SELECT aid, MAX(Date) AS Date
FROM Comments
GROUP BY aid
) AS mc
ON mc.aid = c.aid
AND mc.Date = c.Date
) AS c
ON c.Aid = a.aid;
但是,由於MySQL實現了所有的子查詢,這就避免了Comments
的不一致的實現。兩個查詢的Comparing the execution plans顯示前者會表現更好。