2

我有一个events表,其中有一个名为breaks. 这是用逗号分隔格式的数据填充的,即1,2,31或- MySQL命令使用1,4,5的相同格式。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

4

3 回答 3

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 的行。

于 2013-10-16T15:20:43.720 回答
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)功能的工作原理:

如果字符串 str 在由 N 个子字符串组成的字符串列表 strlist 中,则返回 1 到 N 范围内的值。字符串列表是由以“,”字符分隔的子字符串组成的字符串。[...] 如果 str 不在 strlist 中或 strlist 是空字符串,则返回 0。

另请注意,IN (val1, val2, val3)这与逗号分隔字符串的位置不同IN (val4)val4IN 子句将按相等进行比较。

于 2013-10-16T15:20:21.880 回答
0

您可能需要一个子选择来返回拆分字符串

... NOT IN (SELECT your_split_fnc(`event`.`breaks`) FROM `events`)

请参阅此处的答案以了解在 MySQL 中拆分字符串的方法可以 Mysql 拆分列吗?

instr() MySQL 函数也可能有帮助

... INSTR(event.breaks,id) = 0

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_instr

于 2013-10-16T15:25:32.610 回答