4

次のようなクエリがあります。

SELECT COUNT(A.Value1) AS Count, B.id AS Id1, C.id AS Id2
FROM Table1 A LEFT JOIN Table2 B ON (B.Name LIKE '%UserInput1%')
LEFT JOIN Table3 C ON (C.Name LIKE '%UserInput2%')
WHERE A.Value1 LIKE 'CertainValue'

クエリは完全に正常に実行されます。取得したCOUNTは、のsのTable1数の実際のカウントではなく、実際に結合されているテーブルの数を掛けたsの数を示しているだけです。Value1Table1Value1

他のテーブルを結合しながら、の基準に適合するTable1だけからCOUNTを取得する方法はありますか?A.Value1 LIKE 'CertainValue'

参考: MySQLを使用しています!

4

3 に答える 3

3

さて、私はあなたがあなたに追加できると思いDISTINCTますCOUNT

SELECT COUNT(DISTINCT A.Value1) AS Count, B.id AS Id1, C.id AS Id2
FROM Table1 A LEFT JOIN Table2 B ON (B.Name LIKE '%UserInput1%')
LEFT JOIN Table3 C ON (C.Name LIKE '%UserInput2%')
WHERE A.Value1 LIKE 'CertainValue'

相互に関係がないように見えるテーブルを結合しているため、クエリ全体は実際にはあまりきれいではありません。結果セットはかなり混乱するはずです。

于 2012-08-08T23:33:37.750 に答える
2

問題は、参加後にカウントを行っているため、結果の外積に含まれるA.Value1の数をカウントしていることです。元のテーブルからのカウントが必要な場合は、サブクエリを使用する必要があります。これによってパフォーマンスの問題が発生することはあまりないと思います。結果として得られる結合のサイズが小さくなるため、実際には改善されるはずです。

SELECT ACount, B.id AS Id1, C.id AS Id2
FROM (Select COUNT(*) ACount FROM Table1 WHERE Value1 LIKE 'CertainValue') A 
LEFT JOIN Table2 B ON (B.Name LIKE '%UserInput1%')
LEFT JOIN Table3 C ON (C.Name LIKE '%UserInput2%')
于 2012-08-09T00:23:37.993 に答える
0

A、B、およびCがまったく結合されていないため、記述されたクエリはデカルト積を返します。また、countはキーワードであり、selectで別の識別子を使用するのが最適です。次のようにクエリを記述してみてください。

SELECT COUNT(A.Value1) AS MyCount, B.id AS Id1, C.id AS Id2
FROM Table1 A
LEFT JOIN Table2 B ON A.?? = B.??
LEFT JOIN Table3 C ON A.?? = C.??
WHERE A.Value1 LIKE '%CertainValue%'
AND B.Name LIKE '%UserInput1%'
AND C.Name LIKE '%UserInput1%'
GROUP BY B.id, C.id
于 2012-08-09T00:12:27.387 に答える