使用常量时,mysql 依赖子查询停止工作

标签 mysql

使用 MySQL 5.7.17-log 我们有许多报告查询在 select 语句中使用依赖子查询,当应该有值时返回 null。我知道这种风格可以重构为左连接,但我想了解我们遇到这个问题的原因,并可能向 MySQL 提交错误。这是重现此问题的最简单方法:

CREATE TABLE tableA (
  id varchar(36) NOT NULL,
  col2 int(10) unsigned zerofill NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
;
CREATE TABLE tableB (
  id varchar(36) NOT NULL,
  col2 int(10) unsigned zerofill NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE tableC (
  refA varchar(36) NOT NULL,
  refB varchar(36) NOT NULL,
  PRIMARY KEY (refA, refB),
  CONSTRAINT fkCA FOREIGN KEY (refA) REFERENCES tableA (id),
  CONSTRAINT fkCB FOREIGN KEY (refB) REFERENCES tableB (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE tableD (
  refA varchar(36) NOT NULL,
  refB varchar(36) NOT NULL,
  col3 int(10) unsigned zerofill NOT NULL,
  PRIMARY KEY (refA, refB),
  CONSTRAINT fkDA FOREIGN KEY (refA) REFERENCES tableA (id),
  CONSTRAINT fkDB FOREIGN KEY (refB) REFERENCES tableB (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into tableA values ('123',5)
;
insert into tableB values ('234',6)
;
insert into tableC values ('123','234')
;
insert into tableD values ('123','234',7)
;
select a.id as 'aid',
       b.id as 'bib', 
      ( select d.col3 from tableD d where d.refA=a.id and d.refB=b.id ) as 'shouldBe7'
from tableA a
     inner join tableC c on c.refA = a.id
     inner join tableB b on c.refB = b.id
where a.id='123'
group by a.id, b.id
;

尽管我期望 ['123','234',7],但 select 语句会生成 ['123','234',null]。如果您删除语句中的 where 子句 (where a.id='123'),您将得到预期的结果 - ['123','234',7]。 我对整个 select 语句做了解释,看到“ref”使用了一个函数,我做了一个 SHOW WARNINGS 并且依赖子查询正在将 id 与空字符串进行比较。 (/* select#2 */select dev.d.col3 from dev.tableD d 其中 ((dev.d.refA = '') 和 (dev .d.refB = dev.b.id) )) AS shouldBe7

似乎是 5.7 的错误...我已经提交了 http://bugs.mysql.com/87915 . db-fiddle 工具很有帮助 - 谢谢 James!

最佳答案

这对我来说是在 10.1.25-MariaDB 本地开箱即用的:

已尝试 this 5.6 fiddle它奏效了。

已尝试 this 5.7 fiddle而且它也有效

我查看了您的代码,但没有发现此错误的任何明显原因,您是否尝试过其他 5.7 实例以排除任何可能的本地原因?

问候,

詹姆斯

关于使用常量时,mysql 依赖子查询停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475961/

相关文章:

mysql - 在 SQL 中给出当前经纬度时如何获得 5 公里距离的环境

mysql - 将子查询的 SUM() 结果计算为总计

php - PHP 和 MySQL 的问题

javascript - Backbone JS : How to cascade Model#destroy?

php - PHP 和 MySQL 的初学者问题

php - 在屏幕上显示用户的用户名。出现 'Undefined Index' 错误

php - 向 MySQL 查询添加 JOIN 会抛出奇怪的错误

mysql - 根据年份更新数据

mysql - 在 MySQL 中生成动态数据透视表

mysql - pid 文件参数在 my.cnf 中被忽略