2012-08-08 214 views
1

我有一個查詢,看起來像這樣: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

回答

1

的問題是要加入後做計數,所以你在最終的交叉產品計數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

1

好吧,我想你可以添加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

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 
相關問題