mySQL 有序且不同
mySQL ordering and distinct
我的网站上有一个评论系统,用户(个人资料)可以为其他人留下评论。这部分工作正常。
但在我的主页上,我想获得 10 条最新评论,但我不想重复任何评论 users/profiles(即,如果用户有 2 条评论,我只想要最新的)
添加 DISTINCT 不会执行此操作,因为所有 reviews/rows 都是唯一的。
(我确实添加了 DISTINCT,因为一些用户提交了重复的评论...)
我试过按配置文件 ID 分组,但这不一定是 return 最新的评论,我不知道该怎么做。
(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
关于我如何检索 10 个结果的任何想法(没有在 php 中过滤),按日期顺序但只包括每个用户一次(因此如果用户有 2 条评论,则只有最近的评论是 returned)?
您可以先从 reviews
select 每个用户的最大日期,然后重新加入自身并 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
我的网站上有一个评论系统,用户(个人资料)可以为其他人留下评论。这部分工作正常。
但在我的主页上,我想获得 10 条最新评论,但我不想重复任何评论 users/profiles(即,如果用户有 2 条评论,我只想要最新的)
添加 DISTINCT 不会执行此操作,因为所有 reviews/rows 都是唯一的。 (我确实添加了 DISTINCT,因为一些用户提交了重复的评论...)
我试过按配置文件 ID 分组,但这不一定是 return 最新的评论,我不知道该怎么做。 (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
关于我如何检索 10 个结果的任何想法(没有在 php 中过滤),按日期顺序但只包括每个用户一次(因此如果用户有 2 条评论,则只有最近的评论是 returned)?
您可以先从 reviews
select 每个用户的最大日期,然后重新加入自身并 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