Mysql计算JOIN表语句中的行数,可能吗?

标签 mysql

给出这个查询:

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/

相关文章:

php - MySQL WHERE LIKE 无法使用 php 和 pdo bind 处理多个字段

php - 当我添加 root 密码时,XAMPP 未将 "unsecure"更新为 "secure"

mysql : update on recursive category table structure?

mysql - 进行数据同步时检查已删除项目的最佳方法?

python - 在 Django 中获取 'popular categories'

mysql - 是否可以在 Sequelize 关系中添加额外的字段?

mysql - 在 mysql JOIN 查询的 'ON' 子句中使用 mysql 函数

mysql - 对计数结果进行计数和分组

php - 在文本字段中搜索日期范围

c# - 如何更改起始位置组合框 C# mysql