mySQL排序和不同

时间:2015-01-26 04:02:26

标签: php mysql group-by sql-order-by

我的网站上有一个评论系统,用户(个人资料)可以为其他人留下评论。这部分工作正常。

但在我的主页上我想获得10条最新评论但我不想复制任何用户/个人资料(即如果用户有2条评论我只想要最新的评论)

添加DISTINCT不会这样做,因为所有评论/行都是唯一的。 (我确实添加了DISTINCT,因为有些用户提交了重复的评论......)

我已尝试过GROUP BY ProfileID,但这并不一定会返回最新的评论,我无法解决如何执行此操作。 (GROUP BY有一种预期的效果,但我认为可能会混淆数据并且没有按日期顺序得到结果)

以下(简化)SQL是我目前拥有的,但这会为每位用户带来超过1次审核(如果他们有超过1份)

SELECT DISTINCT LEFT(r.ReviewText, 100) as Review, r.ReviewRating, r.ReviewDate,
p.ProfileName, p.Location, p.ProfileID,
((date_format(now(),'%Y') - date_format(p.DateOfBirth,'%Y')) - (date_format(now(),'00-%m-%d') < date_format(p.DateOfBirth,'00-%m-%d'))) AS Age
FROM tReview r
INNER JOIN tProfiles p ON p.ProfileID = r.tProfiles_ProfileID                                                       
WHERE r.ReviewWithdrawn = 0
  AND r.ReviewEnabled = 1
  AND p.Enabled = 1
ORDER BY r.ReviewDate DESC                    
LIMIT 10

任何想法(没有在PHP中过滤)我如何检索10个结果,按日期顺序但只包括每个用户一次(所以如果用户有2个评论,只会返回最新的)?

1 个答案:

答案 0 :(得分:1)

您可以先从reviews选择每个用户的最长日期,然后再加入自身和profiles以获取所有其他列。

SELECT LEFT(r.ReviewText, 100) as Review, 
       r.ReviewRating, r.ReviewDate, p.ProfileName, p.Location, p.ProfileID,
       ((date_format(now(),'%Y') - date_format(p.DateOfBirth,'%Y')) - 
        (date_format(now(),'00-%m-%d') < date_format(p.DateOfBirth,'00-%m-%d'))) AS Age
  FROM
(
  SELECT p.ProfileID, MAX(r.ReviewDate) ReviewDate
    FROM tReview r JOIN tProfiles p 
      ON r.tProfiles_ProfileID = p.ProfileID
   WHERE r.ReviewWithdrawn = 0
     AND r.ReviewEnabled = 1
     AND p.Enabled = 1
   GROUP BY p.ProfileID
   ORDER BY ReviewDate DESC
   LIMIT 10
) q JOIN tReview r 
      ON q.ProfileID = r.tProfiles_ProfileID
     AND q.ReviewDate = r.ReviewDate 
    JOIN tProfiles p 
      ON r.tProfiles_ProfileID = p.ProfileID