给出这个查询:
SELECT DISTINCT a.dogTag, a.dateEdited
FROM dvdpedia a
JOIN dvd_uploads b ON a.dogTag = b.dogTag
JOIN dvd_moderators c ON a.dogTag = c.dogTag
WHERE b.uploader != 9 AND c.moderator != 9
ORDER BY a.dogTag ASC
LIMIT 50;
我只想从 dvd_moderators 中选择仅出现一次的行,即仅审核过一次而不是多次且与给定的 userID 不匹配的行(本例中为 9)。
dvd_moderators
看起来像这样:
id dogTag moderator
219 2 9
2226 2 7
当然,其他条目的主持人 ID 会发生变化。
使用 COUNT 大部分情况下都有效,除非用户 ID 与主持人匹配:
SELECT a.dogTag, a.dateEdited, COUNT(c.dogTag) AS moderations
FROM dvdpedia a
JOIN dvd_uploads b ON a.dogTag = b.dogTag
JOIN dvd_moderators c ON a.dogTag = c.dogTag
WHERE b.uploader != 9 AND c.moderator != 9
GROUP BY c.dogTag
HAVING moderations = 1
ORDER BY a.dogTag ASC
LIMIT 50;
然后它报告它只被审核一次(这是一个正确的查询,它丢弃与主持人 = 9 匹配的行,因此计数为 1 而不是 2),但对于我需要的目的来说是不正确的。
基本上,我想要只审核一次的行,并且其中一个审核者与用户 ID 不匹配(上例中的 9)。
我怎样才能实现这个目标?
谢谢。
最佳答案
感谢 Sitepoint 的 Guido,这是他提供的解决方案。我把它放在这里,希望它能帮助处于类似情况的其他人:
SELECT a.dogTag, a.dateEdited
FROM dvdpedia a
JOIN dvd_uploads b ON a.dogTag = b.dogTag
JOIN dvd_moderators c ON a.dogTag = c.dogTag
JOIN
(SELECT dogTag
FROM dvd_moderators
GROUP BY dogTag
HAVING count(dogTag) = 1
) AS d
ON a.dogTag = d.dogTag
WHERE 1=1
AND b.uploader != 9
AND c.moderator != 9
ORDER BY a.dogTag ASC
LIMIT 50;
还有link如果有人感兴趣,请访问该帖子。
关于Mysql计算JOIN表语句中的行数,可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12493867/