MySQL 5.7.17-logを使用 select文に依存するサブクエリを使用して、値が必要なときにnullを返すレポートクエリが多数あります。私はこのスタイルが左結合にリファクタリングできることを知っていますが、私たちがこの問題を抱えている理由を理解し、おそらくMySQLにバグを報告したかったのです。ここでこれを再現するための最も簡単な方法は次のとおりです。定数を使用すると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'、ヌル]私が期待するものの[ '123'、 '234'、7]。ステートメント(where a.id = '123')のwhere句を削除すると、期待される結果 - ['123'、 '234'、7]が得られます。 私はselect文全体について説明をして、 "ref"がSHOW WARNINGSを実行したfuncを使用し、従属サブクエリがidを空の文字列と比較していることを確認しました。 shouldBe7
AS (/ * */dev
を選択#2を選択する。d
。dev
からcol3
。tableD
d
場合((dev
。d
。refA
= '')及び(dev
。d
= dev
refB
。b
。id
)))
私はhttp://bugs.mysql.com/87915を提出しました。 db-fiddleツールは役に立ちました - ありがとうJames!
はい、私はこれを3つのインスタンス(2つのLinuxサーバーと1つのローカルウィンドウ10)で再現しました。マルチバイトのデフォルトの文字セットを使用しているので、それには関係があります。 db-fiddle内の各createテーブルの最後に "DEFAULT CHARSET = utf8mb4"を追加すると、そこに再現できます。 –
このバグは5.7で発生したようです(5.6 db-fiddleはまだ文字セットの変更で動作していました)。 –
この情報に基づいてバグレポートを作成しています。現在MySQL 5.7ボックスにアクセスできないPercona 5.7でお試しください –