2013-10-16 19 views
2

我有一個events表,其中有一個字段名爲breaks。這些數據以逗號分隔的格式填充,即1,2,311,4,5 - 與MySQL的IN命令使用的格式相同。從一個表中使用逗號分隔的列表作爲另一個表的查詢子句

然後我想運行一個查詢 - 在slots表上 - 將所有行與events.breaks中指定的行相區別。

查詢,從理論上說,應該是這樣的:

SELECT 
    `slots`.`id` AS id, 
    RIGHT(`slots`.`time`, 8) AS `time` 
FROM 
    `slots`, `event` 
WHERE 
    `slots`.`id` NOT IN (`event`.`breaks`) 

但這似乎並沒有工作 - 如果event.breaks4,5,7,從slots表不返回唯一的行4

SQLFiddle這裏:http://sqlfiddle.com/#!2/913fe/1/0

+0

您應該查看FIN D_IN_SET作爲潛在的解決方案。 – AgRizzo

回答

2

試試這個:

SELECT slots.id AS id, RIGHT(slots.time, 8) time 
FROM slots, event 
WHERE FIND_IN_SET(slots.id, event.breaks) = 0 

這是FIND_IN_SET(str,strlist)功能是如何工作的:

如果在1範圍內返回一個值到N字符串str位於由N個子字符串組成的字符串列表strlist中。字符串列表是由由「,」字符分隔的子字符串組成的字符串。 [...]如果str不在strlist中,或者strlist是空字符串,則返回0。

還要注意的是IN (val1, val2, val3)是不一樣的IN (val4)其中val4是commma分隔的字符串。 IN子句將按等式進行比較。

+1

完美 - 但我最初由於'FIND_IN_SET'和'('!:)之間的空間而得到'FIND_IN_SET函數不存在'錯誤,以防其他人正在尋找答案。謝謝Mosty。 – dunc

+0

歡迎。最奇怪的空間問題:) –

3

您將單個字段傳遞給NOT IN()子句,而不是子表達式。你可以把它像這樣

(1, 2, 3) 

是大致相同

SELECT 1 
UNION 
SELECT 2 
UNION 
SELECT 3; 

的子表達式。你在做什麼,而不是爲

('4,5,7') 

這大致相當於

SELECT '4,5,7'; 

這反過來可能的MySQL轉換爲數字的比較,結果是

NOT IN (4) 

什麼你實際上試圖做的並不是真的應該這樣做。如果你添加了一個AxB關係表,這樣會更好,所以你可以選擇多個不需要的ID。

+0

+1的解釋,但莫斯提供了一個工作解決方案。 – dunc

+0

Aye,使用FIND_IN_SET可以工作,但是對於每個不想要的條目都有獨立的表格,它會更清晰 - 如果您的數據不斷增加,它可能會更快;)。 – Magnus

相關問題