mysql進行inner join on查詢,關聯字段因爲字段類型不同導致查詢結果有誤。

today,測試同學反映某某查詢功能出現問題,沒有配置的數據還是查詢出來了,翻閱代碼進行查看,抽取出查詢的sql,進行客戶端查詢發現確實有沒有關聯的數據還是查詢出來了,排查了好久定位到,是關聯的字段類型不匹配導致的原因。

解決方式:使用mysql的cast函數,例如下面圖片中的改法即可解決。

好了知道解決方案了,講解下原因以及場景,方便同學們針對自己的情況作出分析。

首先創建2張表:

在我圈起來的地方一會要跟一張水果表進行關聯

這2張表中的圈起來的部分進行關聯查詢,可以看到一個是 int(11)  一個是 varchar(64)  類型,2種不同類型進行關聯會產生什麼情況呢?接下來我們繼續說明。

列舉出2個表的數據:

goods表:

orange表:

 

看到兩張表的數據了,接下來我需要 goods 表的 id 字段與orange 表的 goods_type 字段進行關聯,看懂的同學應該能知道,理論上關聯之後查出來的數據一定是下面這個樣子的:

但是在我們執行了,下面的sql語句之後產生了什麼數據呢?

sql語句如下:

select g.name as goods_name ,o.goods_type,o.name
from goods g inner join orange o on g.id = o.goods_type
where g.type = 1

查詢出來的數據如下:

誒?居然查詢出了一個goods_type 是 1ad...(反正是小T瞎編的),這不應該啊。是的啊,起初碰到這個bug的時候我也是這麼想的,後來多方查詢知道,mysql在做不同類型字段關聯的時候,會把字段轉成相同類型比較,可能就會導致這種沒有關聯的數據出現。

所以,碰到上面這種問題的同學,參照本帖開篇所說的情況進行解決。

但是千萬切記,做表關聯的時候,關聯字段一定要是相同字段,因爲如果做大數據量連表查詢的時候,本就因爲連表導致的查詢效率降低,如果字段類型不同,同時還會導致mysql會不停的進行轉換類型比較,這樣的話,可能會導致查詢效率降低,無限堆積的慢查詢sql可是會使系統整體出現問題的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章