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

クリス = グループ ID 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

タリシュとベンダー = 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 で 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 は意味がありません (私が間違っていなければ)。

また、値を 1 つだけ入力する場合は IN を使用する必要はありませんが、これは単なるサンプル コードだと思います。

COUNT(distinct postID)また、正しいグループ化で使用する必要はありません。使うだけCOUNT(*)

于 2012-09-21T09:29:00.610 に答える