为什么MySQL等号符合错误的条目?

时间:2015-03-13 15:23:06

标签: mysql sql equals sql-like

我在两个表上运行select查询,并使用等号搜索匹配的条目。根据我的理解,MySQL应该只返回与WHERE条件完全匹配的条目,但是它会返回类似于我使用LIKE语句的条目:

enter image description here

任何解释为什么第一行会因查询而返回?

编辑:

以下是查询:

SELECT `ts`.`ticker_symbol`, `sm`.`id` AS `matchescount`, `sm`.`ticker_symbol_ids`
FROM `mk_ticker_symbols` `ts`, `mk_submissions` `sm`
WHERE `sm`.`ticker_symbol_ids` = `ts`.`id` AND `ts`.`id` = "1506"

编辑2: 这是SQL小提琴: http://sqlfiddle.com/#!9/5550b/1/0

编辑3: 这里是JOIN的SQL小提琴: http://sqlfiddle.com/#!9/5550b/2/0

4 个答案:

答案 0 :(得分:2)

皮耶罗, 可以更正具有JOIN的那个。 <{1}}中的CAST()将解决问题。

JOIN

我知道你不是在寻找解决方案,但我仍然发布它。

问题非常有趣。 我在网上搜索,并在我的数据库上做了一些试错。我没有解释.... 我试图将INNER JOIN `mk_submissions` `sm` ON `sm`.`ticker_symbol_ids` = CAST(`ts`.`id` AS CHAR(10)) 放在逗号分隔列表中的第二个或第三个位置 - 查询工作正常。 所以,我有一种感觉,如果1506,以逗号分隔的列表,逗号被视为通配符'字符串结束'...

如果您找到解释,请在此处发布。

答案 1 :(得分:2)

evaluating expressions时,MySQL将两个参数(在本例中)转换为浮点数以进行比较。这是因为一个是字符串,一个是整数,这导致上面链接中的最终条件被应用。

  

在所有其他情况下,参数将被比较为浮点数   (实际)数字。

那么字符串“1506,......”的浮点等价物是什么?

在我的测试服务器上运行以下命令:

SELECT "1506,3101,26673,26745,2277,1216,26847,26865,20711,1468,26947,233,20539,26985"+0.0

结果:

1506

当然,这等于整数1506的浮点版本。

所以,一切都表现得像预期的那样。至少,假设你期望发生这种浮点比较。

答案 2 :(得分:0)

我无法对问题给出完整的解释,但我有一个解决方案。

ts.id很可能是INTEGER所以你的where子句应该是

`ts`.`id` = 1506

(从数字中删除引号)。

此外,您应该使用连接而不是where子句来匹配表:

FROM `mk_ticker_symbols` `ts`
JOIN `mk_submissions` `sm` on sm.ticker_symbol_ids = ts.id

答案 3 :(得分:0)

我找到了这个问题的答案。我在这里比较字符串和整数:

  

`sm``ticker_symbol_ids` =`ts` .id` AND`ts` .id` =“1506”

问题是,在内部将其转换为整数以进行比较:  1506,3101,26673,26745,2277,1216,26847,26865,20711,1468,26947,233,20539,26985

由于逗号,MySQL认为它是带浮点的十进制或浮点数,并且省略逗号之后的所有内容以进行比较。因此它变为1506而不是1506,3101,26673,26745,2277,1216,26847,26865,20711,1468,26947,233,20539,26985,并且符合WHERE条件。

@cyadvert和@Willem_Renzema是完全正确的。

解决此问题 我只需要:

  

CAST(`ts` .id` AS CHAR)