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

时间:2017-09-28 18:25:24

标签: 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
;

select语句产生['123','234',null]虽然我希望['123','234',7]。如果删除语句中的where子句(其中a.id ='123'),则得到预期结果 - ['123','234',7]。 我对整个select语句做了一个解释,看到“ref”使用了一个func,我做了一个SHOW WARNINGS,而依赖子查询将id与空字符串进行比较。     (/ *从dev选择#2 * /选择dcol3devtableD d其中((dev }。drefA ='')和(devdrefB = devb。{ {1}})))AS id

好像是一个5.7小虫......我已经提交了http://bugs.mysql.com/87915。 db-fiddle工具很有帮助 - 感谢James!

2 个答案:

答案 0 :(得分:1)

我在10.1.25-MariaDB本地开箱即用:

尝试this 5.6 fiddle并且有效。

尝试this 5.7 fiddle并且它也有效

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

此致

詹姆斯

答案 1 :(得分:0)

尝试这一点......总有不止一种方法可以给猫皮肤。

version: 2
jobs:
  build:
    working_directory: ~/code
    docker:
      - image: circleci/android:api-25-alpha
    environment:
      JVM_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - store_artifacts:
          path: app/build/reports
          destination: reports
      - store_test_results:
          path: app/build/test-results