2015-07-28 102 views
0

等於我有這樣的MySQL查詢LEFT JOIN返回結果爲未接通

SELECT bm_events.name AS event_name, 
     bm_events.uid AS event_uid, 
     bm_events.organising, 
     bm_organising_company.uid, 
     bm_organising_company.name 
FROM bm_events LEFT JOIN bm_organising_company 
    ON bm_events.organising = bm_organising_company.uid 

這裏是結果

Acontraluz 68 66,90 66 Advanced Music S.L. 

列 「bm_events.organising」 是用逗號分隔值的VARCHAR。

因此,對於bm_events表中的「bm_events.organising」等於「66,90」,我期望對bm_organising_company.uid和bm_organising_company.name沒有結果。

你能向我解釋爲什麼我得到了bm_organising_company.uid = 66的結果嗎?

謝謝:)

+1

當您將一個字符串與MySQL中的一個int進行比較時,該字符串將轉換爲一個int值,然後進行比較。 「66,90」變成66作爲整數。 – Vatev

+0

如果您想比較VARCHAR,則需要使用'like'關鍵字而不是'='。 –

+0

如此明顯。我認爲這是一個嚴格的比較。再次感謝。 – metameta

回答

0

這是您的查詢:

SELECT e.name as event_name, e.uid as event_uid, e.organising, oc.uid, oc.name 
from bm_events e left join 
    bm_organising_company oc 
    on e.organising = oc.uid 

正如在評論中提到,你有一個字符串和數字之間的比較。那是你的問題的表現,你可以使用find_in_set()修復:

on find_in_set(oc.uid, e.organizing) 

然而,這不是你的問題的根源。你的問題的主要原因是你正在存儲整數列表中的字符串。以下是你不想這樣做的原因:

  • 值應該存儲在正確的類型,所以一個數字應該存儲爲一個數字。
  • ID應該有問題的外鍵引用。你不能用字符串來做到這一點。
  • 比較的語義很混亂。
  • SQL具有正確的列表數據結構。他們被稱爲「表格」。
  • 由此產生的查詢不能利用索引,所以他們沒有優化。

所以,你應該有一個名爲OrganizingUsers的表,每個「事件」和每個「用戶」有一行。這被稱爲聯結表,並且是在SQL中表示列表的正確方式。