SQL:获取一个数据表的计数,并加入其他

问题描述:

我有一个查询,看起来像这样:SQL:获取一个数据表的计数,并加入其他

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我从Table1得到的数据不会给我的数量Table1的实际计数,而是Value1的数量乘以实际加入的表的数量。

有什么办法,我可以从表1只适合进入A.Value1 LIKE 'CertainValue'标准得到COUNT,而加入其他表?

FYI:我使用MySQL!

+0

您的查询目前返回[不确定的结果(http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html)。当有多个匹配时,你希望从其他表中得到什么值?是否故意没有“GROUP BY”? – 2012-08-08 22:36:05

+0

您还需要将各个表彼此关联。 “A”中的行如何与“B”中的行相关? – 2012-08-08 22:44:34

+0

其实我只想从每个表中获取单独的结果(因为这些值或多或少都是唯一的),但我想要从Table1中获得与最终条件相对应的值数的COUNT。 COUNT会是1或0. – matt 2012-08-08 22:58:44

的问题是要加入后做计数,所以你在最终的交叉产品计数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%') 
+0

帮我卸载,谢谢 – 2014-06-17 15:32:19

好吧,我想你可以添加DISTINCTCOUNT

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' 

整个查询真的不是很漂亮,因为您连接的表彼此之间似乎没有任何关系。结果集应该是相当混乱的。

+0

我知道这有点凌乱,但我认为子查询会吃更多的表现......?好吧,我会给它一个! – matt 2012-08-08 23:59:03

+0

结果是正确的。与子查询解决方案相比,您的解决方案速度更快。谢谢Holger。 – Mirko 2017-12-07 07:45:02

书面会返回一个笛卡尔积,因为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