【问题标题】:Why does MySQL equal sign matches wrong entries?为什么 MySQL 等号匹配错误的条目?
【发布时间】:2015-03-13 15:23:05
【问题描述】:

我正在对两个表运行选择查询,并使用等号搜索匹配的条目。在我的理解中,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 Fiddle: http://sqlfiddle.com/#!9/5550b/2/0

【问题讨论】:

  • 我看不懂那个查询,你能把文字放在你的问题中吗?
  • 您应该考虑升级到 ANSI-92 连接。 my.vertica.com/docs/6.0.x/HTML/index.htm#15163.htm
  • 我没有在这个查询中一起使用JOINs,我需要完全匹配和高性能以及保持查询简单。毫无疑问,JOINs 可以正常工作,但不清楚为什么这个查询不能正常工作。
  • 我在您的 FROM 子句中看到两个表,并且在您的 WHERE 子句中看到这两个表之间的相等性。那怎么不是JOIN
  • 您正在使用逗号进行隐式内部连接:From x, y。您能否创建一个 sql fiddle (sqlfiddle.com) 并在此处发布标记?包括您的表架构和一些示例数据

标签: mysql sql equals sql-like


【解决方案1】:

皮耶罗, 可以更正带有 JOIN 的那个。 CAST() 内的 JOIN 将解决此问题。

INNER JOIN `mk_submissions` `sm`
    ON `sm`.`ticker_symbol_ids` = CAST(`ts`.`id`  AS CHAR(10))

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

这个问题很有趣。 我在网上搜索,并在我的数据库上做了一些试验错误。我没有任何解释...... 我试图将1506, 放在逗号分隔列表的第二或第三位 - 查询工作正常。 所以,我有一种感觉,如果JOIN 带有逗号分隔列表,逗号会被视为通配符“字符串结尾”...

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

【讨论】:

  • 非常感谢您在发布反馈之前调查问题的根源。确实看起来逗号就像一个通配符,不仅有显式 JOIN,还有隐式 JOIN,比如 SELECT -- FROM table1, table2。这可能是 MySQL 中的一个错误。也许我应该报告它。如果我找到解释,我一定会回复。
【解决方案2】:

evaluating expressions 时,MySQL 将两个参数(在这种情况下)转换为浮点数来比较它们。这是因为一个是字符串,一个是整数,导致上面链接中的最终条件被应用。

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

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

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

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

结果:

1506

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

所以,一切都按预期运行。至少,假设您预计会发生这种浮点比较。

【讨论】:

    【解决方案3】:

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

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

    `ts`.`id` = 1506
    

    (从数字中删除引号)。

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

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

    【讨论】:

    • 相同的结果返回不带引号的整数。为什么要使用 JOIN?此查询应该按预期工作,否则为什么?
    • JOIN 更快更好。对两个查询运行 EXPLAIN。
    • 我真的不是在寻找其他解决方案,而是想知道为什么这个会失败。
    • 添加了 JOIN 的小提琴,没​​有区别。
    【解决方案4】:

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

    `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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2021-09-23
      • 2019-03-18
      • 1970-01-01
      • 2015-12-10
      相关资源
      最近更新 更多