2012-05-21 93 views
0

我在Mysql中有兩個表,一個是持有承包商,另一個是持有項目,我想生產一個承包商 - 項目報告,顯示項目的應用程序。問題是INNER JOIN,LEFT和RIGHT OUTER JOINS,都產生相同的結果,只顯示承包商有一個項目,即使我忽略了似乎很奇怪的情況。這裏是我的陳述內部聯接和外部聯接產生相同的結果

SELECT DISTINCT (tbl_contractor.name_v), count(tbl_project.name_v) 
FROM tbl_contractor 
INNER JOIN tbl_project 
    ON tbl_project.Contractor=tbl_contractor.contractor_id_v 
    ON tbl_project.Contractor = tbl_contractor.contractor_id_v 
LIMIT 0 , 30; 

SELECT DISTINCT (tbl_contractor.name_v), count(tbl_project.name_v) 
FROM tbl_contractor 
LEFT OUTER JOIN tbl_project 
ON tbl_project.Contractor = tbl_contractor.contractor_id_v 
LIMIT 0 , 30; 
+0

嘗試從查詢中取出不同。 –

+0

http://stackoverflow.com/questions/38549/sql-difference-between-inner-and-outer-join 該鏈接應該有助於解釋。基本上你的內部連接正在交叉字段,而你的外部連接顯示了左側匹配空值的所有字段,它們不相交。假設兩張表完全匹配,他們會提供相同的數據。 – Tony318

+0

建議:在您的查詢中添加一個分組以澄清它在做什麼。 –

回答

2

您有一個聚合函數COUNT(),沒有GROUP BY。這意味着你的查詢將只返回一行。

你可能需要一個GROUP BY(承包商):

SELECT tbl_contractor.name_v, COUNT(tbl_project.name_v) 
FROM tbl_contractor 
    LEFT OUTER JOIN tbl_project 
    ON tbl_project.Contractor = tbl_contractor.contractor_id_v 
GROUP BY tbl_contractor.contractor_id_v 
LIMIT 0 , 30; 
+0

你知道,到目前爲止,我總是誤讀文檔:我一直在閱讀文檔時隱含地添加了一個「GROUP BY」,當沒有提供。相反,它就像你說的那樣:在概念上,原始的意思是'SELECT ANY(tbl_contractor.name_v),COUNT(tbl_project.name_v)' - 如果MySQL實際上提供了'ANY'作爲聚合函數而不是隱含地這樣做,它會少得多混亂。 – hvd

+0

是的,其他DBMS會在這樣的查詢中拋出一個錯誤。 MySQL一味地假設一個人知道自己在做什麼並返回一些答案(在這種情況下,在'tbl_contractor.name_v'列中的隨機數據) –

+0

像一個魅力一樣工作,謝謝 – Poly

0

通過這樣做SELECT DISTINCT (tbl_contractor.name_v)查詢只返回一行每個承包商的名字,嘗試刪除不同,看看你得到一個更好的承包商 - 項目成果。

0

這些查詢實際上是通過對承包商的查詢進行分組。如果每個承包商至少有一個項目,則內部和外部的外部聯接將返回相同的結果。如果沒有項目的承包商,則結果受到LIMIT條款的影響。你只能獲得前30名,並且無論出於何種原因,比賽都會首先出現。