以下の表があり、少なくとも1つの列(lay、blk、pri、ani)に「1863」があるはずのデータを取得しようとしていますが、結果は期待どおりではありません。
ここに参考のために表を掲載しています。
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT UNIQUE,
Shot VARCHAR(4),
lay VARCHAR(15) NOT NULL,
lay_status VARCHAR(15) NOT NULL,
blk VARCHAR(10) NOT NULL,
blk_status VARCHAR(15) NOT NULL,
pri VARCHAR(10) NOT NULL,
pri_status VARCHAR(15) NOT NULL,
ani VARCHAR(10) NOT NULL,
ani_status VARCHAR(15) NOT NULL
);
INSERT INTO my_table VALUES
(1,'SH01','1863','yes','1863','yes','P4645','yes','P4557','yes'),
(2,'SH02','1863','yes','P4645','no','P4557','yes','1863','no'),
(3,'SH03','P4645','yes','P4557','yes','1863','yes','1863','yes'),
(4,'SH04','1863','no','P4645','no','P4557','yes','1863','yes'),
(5,'SH05','1863','yes','1863','yes','P4645','yes','P4557','yes'),
(6,'SH06','P4557','yes','P4645','yes','P4645','yes','P4557','yes');
SELECT * FROM my_table;
+----+------+-------+------------+-------+------------+-------+------------+-------+------------+
| id | Shot | lay | lay_status | blk | blk_status | pri | pri_status | ani | ani_status |
+----+------+-------+------------+-------+------------+-------+------------+-------+------------+
| 1 | SH01 | 1863 | yes | 1863 | yes | P4645 | yes | P4557 | yes |
| 2 | SH02 | 1863 | yes | P4645 | no | P4557 | yes | 1863 | no |
| 3 | SH03 | P4645 | yes | P4557 | yes | 1863 | yes | 1863 | yes |
| 4 | SH04 | 1863 | no | P4645 | no | P4557 | yes | 1863 | yes |
| 5 | SH05 | 1863 | yes | 1863 | yes | P4645 | yes | P4557 | yes |
| 6 | SH06 | P4557 | yes | P4645 | yes | P4645 | yes | P4557 | yes |
+----+------+-------+------------+-------+------------+-------+------------+-------+------------+
6 rows in set (0.00 sec)
クエリを作成しましたが、結果は次のようになります
SELECT
x.Shot,
IFNULL(J1.Stage,'NA') as Stage1,
IFNULL(J1.status,'NA') as Status,
IFNULL(J2.Stage,'NA') as Stage2,
IFNULL(J2.status,'NA') as Status,
IFNULL(J3.Stage,'NA') as Stage3,
IFNULL(J3.status,'NA') as Status,
IFNULL(J4.Stage,'NA') as Stage4,
IFNULL(J4.status,'NA') as Status
FROM
(SELECT
Shot
FROM
my_table) x
LEFT JOIN (SELECT
Shot,
lay as Artist,
lay_status as status,
'lay' as Stage
FROM
my_table where lay = '1863') J1 ON J1.Shot = x.Shot
LEFT JOIN (SELECT
Shot,
blk as Artist,
blk_status as status,
'blk' as Stage
FROM
my_table where blk = '1863') J2 ON J2.Shot = x.Shot
LEFT JOIN (SELECT
Shot,
pri as Artist,
pri_status as status,
'pri' as Stage
FROM
my_table where pri = '1863') J3 ON J3.Shot = x.Shot
LEFT JOIN (SELECT
Shot,
ani as Artist,
ani_status as status,
'ani' as Stage
FROM
my_table where ani = '1863') J4 ON J4.Shot = x.Shot
上記のクエリの結果は次のとおりです。
+------+--------+--------+--------+--------+--------+--------+--------+--------+
| Shot | Stage1 | Status | Stage2 | Status | Stage3 | Status | Stage4 | Status |
+------+--------+--------+--------+--------+--------+--------+--------+--------+
| SH01 | lay | yes | blk | yes | NA | NA | NA | NA |
| SH02 | lay | yes | NA | NA | NA | NA | ani | no |
| SH03 | NA | NA | NA | NA | pri | yes | ani | yes |
| SH04 | lay | no | NA | NA | NA | NA | ani | yes |
| SH05 | lay | yes | blk | yes | NA | na | NA | NA |
| SH06 | NA | NA | NA | NA | NA | NA | NA | NA |
+------+--------+--------+--------+--------+--------+--------+--------+--------+
しかし、少なくともlay、blk、pri、aniの1つが「1863」であるレコードを取得する必要がありますが、上記のクエリは、フィールド(lay、blk、pri、ani)以外のSH06でレコードを返しました。 '1863'を持っています
必要な結果は以下のようになります
+------+--------+--------+--------+--------+--------+--------+--------+--------+
| Shot | Stage1 | Status | Stage2 | Status | Stage3 | Status | Stage4 | Status |
+------+--------+--------+--------+--------+--------+--------+--------+--------+
| SH01 | lay | yes | blk | yes | NA | NA | NA | NA |
| SH02 | lay | yes | NA | NA | NA | NA | ani | no |
| SH03 | NA | NA | NA | NA | pri | yes | ani | yes |
| SH04 | lay | no | NA | NA | NA | NA | ani | yes |
| SH05 | lay | yes | blk | yes | NA | NA | NA | NA |
+------+--------+--------+--------+--------+--------+--------+--------+--------+