【问题标题】:MySQL does not match desired records while doing match between integer and varchar IDMySQL 在整数和 varchar ID 之间进行匹配时不匹配所需的记录
【发布时间】:2016-05-28 07:37:42
【问题描述】:

我在做一个查询,即:

SELECT
    `Transaction`.`id`,
    `Transaction`.`total`,
    `Transaction`.`customer_id`,
    `Customer`.`id`,
    `Customer`.`full_name`
FROM
    `mydb`.`transactions` AS `Transaction`
LEFT JOIN `mydb`.`users` AS `Customer` ON (
    `Transaction`.`customer_id` = `Customer`.`id`
)
WHERE
    `Transaction`.`customer_id` = '573edc-fa84-44a2-9bce-0d650ab724ab'
LIMIT 1

看下面的结果(不正确):

在 Transactions 表中,“customer_id”字段是一个 varchar(255) 字段,而在“users”表中,id 字段是一个 integer(11) 字段。我需要保留 customer_id 字段 varchar,因为它应该为来宾用户存储一个 36 个字符长的随机字符串。在此查询中,它将 customer_id 视为整数,因此截断整数值之后的所有内容,并将其与实际用户 ID 573 匹配。

当我像这样进行连接时,它匹配用户 ID 为 573 的记录。我不确定我应该怎么做才能正确匹配记录。在这种情况下,实际上应该没有记录在用户表中,因为它是由访客用户在没有登录的情况下完成的交易。

这里有什么工作?我不会将用户 ID 字段更改为 varchar 或将 customer_id 更改为整数,但仍想做正确的匹配。

我正在研究 CakePHP,但我认为这并不重要,因为当我直接在 phpmyadmin 中运行它时,它会给出相同的结果。

【问题讨论】:

  • 当然它******没有。
  • 有什么解决方法吗?无论如何,谢谢你投票!!
  • 解决方法是什么?使用相同的数据类型存储对应的键。
  • 我不能。这是一个相当大的系统,有几十个网站使用相同的结构,并与各个数据库共享代码。但我需要一个修复程序,它可以一次修复所有网站中的这个错误。客户 ID 和用户 ID 正在多个地方使用,因此无法替换它们。
  • 这里没有错误。只是 dba 的设计存在严重缺陷。

标签: mysql join integer left-join varchar


【解决方案1】:

在 on 语句中有一个 transaction.customer_id 的隐式整数转换,因为转换只查看转换结果为 573 的数字部分,因此您会得到与 users.customer_id 的匹配。您需要在 join 语句中将 users.customer_id 转换或强制转换为 char。

【讨论】:

  • 是的,它看起来像一个答案。致力于此。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2022-10-07
相关资源
最近更新 更多