2017-06-05 18 views
0

我有一個問題,我最近有很多事情要做,最好找到解決方案。 假設我們有兩個表Table1Table2。有沒有辦法在有或沒有條件的情況下在這些表上製作join有或沒​​有條件的Mysql連接表

e.g:

Select * from Table1 t1 left join Table2 t2 on t1.column = t2.column where t2.anothercolumn in (v1,v2,v3) and ...; 

Select * from Table1 t1 left join Table2 t2 on t1.column = t2.column where t2.anothercolumn in ('') and ....; 

因此,在這兩種情況下,我想能夠做一個連接,如果我點上t2列條件,那麼它會告訴我有關,否則顯示一切結果。

目前,如果我把in('')它不會顯示任何東西。

在此先感謝。

回答

0

當你做一個left join,在表條件ON子句中去:

Select * 
from Table1 t1 left join 
    Table2 t2 
    on t1.column = t2.column and 
     t2.anothercolumn in (v1, v2, v3) and ...; 

條件在第一個表去where子句。這可能看起來像一個神祕的規則。但是,如果你瞭解底層機制,那就很有道理。

A left join表中的所有行保留在第一個表中,而不管on子句的計算結果是否爲真。因此,第一個表上的條件對結果沒有影響(因爲left join總是保留第一個記錄)。

另一方面,您的版本將left join變成inner join,因爲當where子句正在處理它們時,第二個表上的值爲NULL

+0

已經這樣做了,如果我把它放在('')中,它不會顯示任何東西 – user2137817

+0

我想如果我把一個值我只得到與該條件相關的記錄,沒有其他內部連接和如果我不知道什麼都沒關係 – user2137817

0

您所提到的要求提及使用內連接。 左連接將從左表中獲取所有記錄,並從右側獲取匹配記錄。如果要對兩個表的交集應用過濾器,請使用內連接。

圖形說明,請訪問:https://www.w3schools.com/sql/sql_join.asp

+0

我知道內部連接是什麼,謝謝你,但是這並不能解決我的問題,如果你在'IN'中放入空值,它不會顯示任何東西 – user2137817

0

進程的MySQL處理查詢的是,它首先執行從那是你的左連接,然後where子句中的列子句指定,比它產生的結果根據select子句中選擇的列設置

(問)現在,如果我放入('')它不會顯示任何內容。 原因,它會查找列在你指定where子句,發現它是否包含「」如果是這種結果顯示,如果不是零排

0
Select * 
from Table1 t1 left join 
    Table2 t2 
    on t1.column = t2.column and 
    t2.anothercolumn in (coalesce (@input, t2.anothercolumn)) and ... 
    where t1.someColumnName is NOT NULL or @value is NULL 
; 

如果@input不爲空,則所有的字段會返回,否則過濾的字段將被返回。

+0

謝謝嘗試,但這仍然不是我想要的,如果我把null放在@input它給一切都正確,但如果我把一個值我會得到記錄的值加上由左連接引起的空值ofc和我只想要一個具體的記錄與值 – user2137817

+0

任何特定的原因不使用內部聯接與此查詢? –

+0

一些記錄沒有映射,所以我想顯示他們也沒有輸入時,如果我把內心他們不會出現 – user2137817