質問を読み直しましたが、どのクエリが何を返しているのかわかりません。
期待されること:
それがあなたが見ている行動であるなら、これはすべて予想されることです。
DISTINCT 演算子は重複する行を削除します。これにより、198 と 250 の違いが説明されます。実行計画の最後のステップ (またはほぼ最後のステップ) として LIMIT が適用されるため、最初のクエリで行が返されない理由が説明されます。
2 番目のクエリによって返される 198 行の数を取得するには、2 番目のクエリ (198 行を返す) を別のクエリでラップし、そこから COUNT を取得するのが簡単な方法の 1 つです。
SELECT COUNT(1) AS mycount
FROM (
SELECT DISTINCT p.*
FROM Persons p
JOIN Colors c
ON c.ColorId = p.FavoriteColorId
AND c.ColorName IN ('RED','BLUE','YELLOW')
WHERE p.Name = 'John Doe'
) q
Persons
Persons テーブルから重複を排除せずに、テーブルから行数を取得したい場合、それを取得する 1 つの方法は次のとおりです。
SELECT COUNT(1) AS mycount
FROM Persons p
WHERE p.Name = 'John Doe'
AND EXISTS ( SELECT 1
FROM Colors c
WHERE c.ColorName IN ('RED','BLUE','YELLOW')
AND c.ColorId = p.FavoriteColorId
)
たとえば、 Persons テーブルに UNIQUE で NOT NULL の列が 1 つある場合、次のid INT PRIMARY KEY
ようにすることができます。
SELECT COUNT(DISTINCT p.id) AS mycount
FROM Persons p
JOIN Colors c
ON c.ColorName IN ('RED','BLUE','YELLOW')
AND c.ColorId = p.FavoriteColorId
WHERE p.Name = 'John Doe'
元の答え
その最初のクエリは 10 行以下を返す必要があります。
2 番目のクエリが 198 行を返すことを報告します。その最初のクエリ (LIMIT 句の追加を除いてこれと同じ) がどのように行を返す必要があるのか わかりません。
3 番目のクエリは、単一の行を返す必要があります。
あなたが見ている結果についての良い説明はありません。
Q使用しているクライアント アプリケーションでの動作を除外するためだけに、msyql コマンド ライン クライアントでこの動作を再現できますか?
Q実行している MySQL のバージョンは何ですか? (これは、MySQL のバージョンのバグである可能性があります。)
Qこれらのテーブルはどのエンジン (MyISAM、InnoDB) を使用していますか?
Qテーブルが と一致していることを確認しましたCHECK TABLE tablename EXTENDED
か?
Qまた、クエリの実行中に他のプロセスが行を挿入、更新、および/または削除していないことを確認しましたか?
LIMIT
最初のクエリは、句を指定するという点で少し奇妙ですが、行が返される順序を規定するGROUP BY
or句やその他のものはありません。ORDER BY
DISTINCT
3 番目のクエリは、キーワードが必要ないという点で少し奇妙です。句がない場合、単一の行が返されるGROUP BY
ことを期待しています。SELECT COUNT(*)
私の一部は、観察された行動の報告が正確かどうか疑問に思っています。その 3 番目のクエリは実際に 250 行を返しているのでしょうか、それともカウントの値が 250 の単一の行を返しているのでしょうか? (これらは 2 つの非常に異なるものです。)
通常、演算子が重複行を削除する場合、 a が返す行数よりも大きなSELECT COUNT(*)
値を返すことが期待されます。SELECT DISTINCT p.*
DISTINCT