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 中获取COUNTA.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 回答