mysql左連線丟失null值的問題

2021-10-01 19:17:26 字數 2102 閱讀 4651

如題所示,我們有的時候直接使用左連線查詢,當右表不存在該資料的時候,是可以查出帶有null的列。可是當在where條件中有右表相關的篩選條件時,我們驚奇的發現查詢的結果不帶null值了,換句話說就是查出來的結果比預期的少。

博主之前遇到過這個問題,只不過當時解決了就沒記錄。誰知道前兩天有朋友問到這個sqlnnd給忘記了,又耗費了大半個小時,這裡還是記錄下。

sql相關的表主要是w_order(訂單表)和w_a_info(商品種類表):

select

o.id ,

a.name,

o.order_time

from

w_a_info as a

left join w_order as o on a.id = o.infoid

where

a.ifshow =

200group

by a.id

結果:

id		name			order_time

11 好愧開語音潑猴 1574341554

12 餄烙面 1574587287

9 黃燜雞公尺飯 1574340342

null 黃燜雞1

null

這裡能看到,我們查詢出來的有帶有null值的列。

select

o.id ,

a.name,o.order_time

from

w_a_info as a

left join w_order as o on a.id = o.infoid

where

a.ifshow =

200and o.order_time>

0group

by a.id

結果:

id		name			order_time

11 好愧開語音潑猴 1574341554

12 餄烙面 1574587287

9 黃燜雞公尺飯 1574340342

根據結果發現,我們原來帶有null值的列消失了,是的,是被where中的篩選條件給篩選掉了。只是有時候我們的需求是要獲取所有的商品資訊的,因此這個null列還不能被篩選掉,不然就造成資料缺失了。

這裡推測是因為sql的執行順序,on表連線是先於where條件的,因此我們先on連線之後,產生了不符合條件的null列,然後null列被where條件給篩選掉了。這裡解決方案是把右表的篩選條件放到前面去,也就是連表的地方去。

select

o.id ,

a.name,

o.order_time

from

w_a_info as a

left join w_order as o on a.id = o.infoid and o.order_time>

0where

a.ifshow =

200group

by a.id

結果:

id		name			order_time

11 好愧開語音潑猴 1574341554

12 餄烙面 1574587287

9 黃燜雞公尺飯 1574340342

null 黃燜雞1

null

這裡我們把篩選條件放到連線處,通過on ... and ...的方式,在連線時就附帶上條件,此時不符合條件的資料列還是以null值的方式展現,並不會被後續的where篩選條件給篩選掉。

end

mysql 左連線 重複 mysql左連線重複行

我正在設計乙個類似於4個 的字典資料庫 words wordid lemma senses wordid synsetid synsets synsetid definition samples synsetid sample所以我使用下面的查詢來獲取所有意義定義和樣本 if isset searc...

MySQL左連線 右連線

表a記錄如下 aid anum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表b記錄如下 bid bname 1 2006032401 2 2006032402 3 2006032403 4 2006032404 8 200...

MySQL 左連線 右連線

表a記錄如下 aid anum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表b記錄如下 bid bname 1 2006032401 2 2006032402 3 2006032403 4 2006032404 8 200...