繁体   English   中英

SQL查询结果不同

[英]SQL query with different results

SELECT postID, threadID, COUNT(DISTINCT postID) as count
FROM wbb1_1_post post
LEFT JOIN wcf1_user_to_groups groups
ON post.userID = groups.userID
WHERE threadID IN (468)
AND groupID IN (4,10)
AND isDisabled != 1
AND isDeleted != 1
ORDER BY postID ASC

克里斯= groupID 4

Sebastian S. =群组ID 10

结果:

 postID  threadID  count 
  2811     468      2

一切都正确。

在此处输入图片说明

SELECT postID, threadID, COUNT(DISTINCT postID) as count
FROM wbb1_1_post post
LEFT JOIN wcf1_user_to_groups groups
ON post.userID = groups.userID
WHERE threadID IN (68)
AND groupID IN (7)
AND isDisabled != 1
AND isDeleted != 1
ORDER BY postID ASC

talishh和Bender = groupID 7

结果:

postID  threadID    count
349 (wrong!) 68        3

结果应该是308,因为我想要最旧的帖子(这就是为什么我通过postID ASC进行订购)。 在此处输入图片说明 有没有一种方法可以优化此查询?

这是因为mysql确实具有大量的聚合函数(COUNT,MIN ...)和分组功能。 糟糕的是:您无法控制它的分组方式……而ORDER BY似乎无法解决您所遇到的问题。

使用其他DBMS(和ANSI SQL)时,会强制您对不在聚合函数中的字段进行分组。 看起来很无聊,但是“你知道你能得到什么”。

在您的情况下,只需在PostID上使用MIN,GROUP BY threadID应该可以解决问题。

SELECT MIN(postID), threadID, COUNT(*) as count
FROM wbb1_1_post post
LEFT JOIN wcf1_user_to_groups groups
ON post.userID = groups.userID
WHERE threadID IN (68)
AND groupID IN (7)
AND isDisabled != 1
AND isDeleted != 1
group by threadID

顺便说一句,当您在where语句中使用联接的实体时,您的LEFT JOIN没有任何意义(如果我没错的话)。

如果仅输入一个值,则无需使用IN,但是我想这只是示例代码。

并且无需将COUNT(distinct postID)与正确的分组一起使用。 只需使用COUNT(*)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM