0
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

塞巴斯蒂安 S. = groupID 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 排序的原因)。 在此处输入图像描述 有没有办法优化这个查询?

4

1 回答 1

1

这是因为 mysql 对聚合函数(COUNT,MIN ...)和分组非常慷慨。不好的部分:你无法控制它的分组方式......而且 ORDER BY 似乎并不能解决你的问题。

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

在您的情况下,只需在 PostID 和 GROUP BY threadID 上使用 MIN 就可以了。

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(*)

于 2012-09-21T09:29:00.610 回答