我在两个表上运行select查询,并使用等号搜索匹配的条目。根据我的理解,MySQL应该只返回与WHERE条件完全匹配的条目,但是它会返回类似于我使用LIKE语句的条目:
任何解释为什么第一行会因查询而返回?
编辑:
以下是查询:
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
答案 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)