2015-12-16 101 views
1

如果where子句未填滿,我不希望查詢選擇任何內容,但也許我錯過了某些內容。以下是我使用如何在mysql中使用左連接

SELECT one.id_user, integration, data 
FROM tableOne one 
LEFT JOIN tableTwo two ON two.id_user = one.id_user 
AND two.integration IN ('office', 'Office') 
WHERE one.state='NEW' OR one.state='PAUSED' 
AND two.integration IN ('office', 'Office') 
GROUP BY one.id_user 

查詢的記錄被插入與整合「someValue中」所需的表,而不是「辦公室」或「辦公室」,這意味着在那裏聖誕老人不應該是真實和查詢不應該返回任何東西,但它確實如此。它將id_user和其餘字段返回爲null。

但是,如果集成不是「辦公室」或「辦公室」,即使選擇id_user也不行。

有人能告訴我請問我做錯了什麼?

+0

你的問題是什麼?並且請以實例闡明... –

+0

不要在where子句中的右側表(tableTwo)上添加條件,移動到ON子句以獲得真正的左連接行爲。 (因爲它現在作爲一個普通的內部連接來執行。)編輯:已經存在,所以只需從哪裏刪除。 – jarlh

+0

嘗試將OR替換爲AND:one.state ='NEW'或one.state ='PAUSED' – tharif

回答

1

從我看到你發2個errornous假設存在。

首先是sql語句不是左連接。聽起來很奇怪。這背後的原因是您使用通過在where語句中的左連接加入的第二個表。這將整個左連接轉換爲內部形式。

的第二個假設是

one.state='NEW' OR one.state='PAUSED' AND two.integration IN ('office', 'Office') 

如果two.integration不是(O)處不顯示任何內容。的,並作爲或這意味着效果更強你有

(one.state='NEW') OR (one.state='PAUSED' AND two.integration IN ('office', 'Office')) 

因此,如果狀態是NEW那麼它什麼並不重要整合已爲價值。 你應該糾正這種給:

((one.state='NEW') OR one.state='PAUSED') AND two.integration IN ('office', 'Office') 

,以獲得期望的結果出現。

然後你仍然有內連接和左連接的問題。實質上,如果你真的想要一個左連接(你的問題描述聽起來不像這樣),你必須將two.integration部分移動到左連接部分。如果你想要一個內部聯接,而不是你應該重命名連接的一部分,並把所有的部分地方入在內的部分加入:

  SELECT one.id_user, integration, data 
      FROM tableOne one 
      INNER JOIN tableTwo two ON two.id_user = one.id_user 
      AND two.integration IN ('office', 'Office') 
      AND (one.state='NEW' OR one.state='PAUSED') 
      GROUP BY one.id_user 
0

首先,LEFT JOIN是一個外部聯接,即使在右側表格中沒有匹配項時,也會保留左側表格中的記錄。那麼爲什麼當你只想要比賽時,你會用它?將此設爲INNER JOIN(或就此而言,只需JOIN)。

然後,混合AND和OR使用括號時:

one.state='NEW' OR one.state='PAUSED' AND two.integration IN ('office', 'Office') 

意味着

one.state='NEW' OR (one.state='PAUSED' AND two.integration IN ('office', 'Office')) 
你希望它是指

(one.state='NEW' OR one.state='PAUSED') AND two.integration IN ('office', 'Office') 

propably

1

試試這個:

SELECT one.id_user, integration, data 
FROM tableOne ONE 
INNER JOIN tableTwo two ON two.id_user = one.id_user 
WHERE one.state IN ('NEW', 'PAUSED') AND two.integration IN ('office', 'Office') 
GROUP BY one.id_user; 
+0

有趣的是,只有*答案*沒有*解釋得到upvote。 –

0

where子句轉動left joininner join。爲什麼?因爲當值爲NULL時,two上的條件將失敗。

所以,你的本意大概是:

SELECT one.id_user, integration, data 
FROM tableOne one LEFT JOIN 
    tableTwo two 
    ON two.id_user = one.id_user AND 
     two.integration IN ('office', 'Office') 
WHERE one.state IN ('NEW', 'PAUSED') 
GROUP BY one.id_user; 

沒有必要重複過濾條件中都whereon條款 - 事實上,它爲這個查詢產生不正確的結果。

此外,GROUP BY可能會導致其他問題,因爲integrationdata可能來自任意(匹配)行。但是,這不是你的問題。