如題所示,我們有的時候直接使用左連線查詢,當右表不存在該資料的時候,是可以查出帶有null
的列。可是當在where
條件中有右表相關的篩選條件時,我們驚奇的發現查詢的結果不帶null
值了,換句話說就是查出來的結果比預期的少。
博主之前遇到過這個問題,只不過當時解決了就沒記錄。誰知道前兩天有朋友問到這個sql
,nnd
給忘記了,又耗費了大半個小時,這裡還是記錄下。
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...