前提
どのWHERE
によってSELECT
されたものなのかを判定したいです。
実現したいこと
該当のソースコードでは、CREATE,INSERT
に対し、$ids = [1,2];
を与えてSELECT
して、次の結果を得ることができます。
ID | data | a | b |
---|---|---|---|
1 | あ | 1 | 1 |
2 | い | 2 | 3 |
4 | え | 1 | 4 |
この結果のうち例えば ID=4 を見ると、WHERE a OR b
のa
に該当したためにSELECT
されているわけですが、そのことを次のroots
などのように明示し判定したいのです。(roots
のようなカラムでなくとも、なんらかの方法で判定できれば問題ありません。)
roots | ID | data | a | b |
---|---|---|---|---|
a,b | 1 | あ | 1 | 1 |
a | 2 | い | 2 | 3 |
a | 4 | え | 1 | 4 |
該当のソースコード
sql
1CREATE TABLE posts 2 (`ID` int, `data` varchar(10), `a` int, `b` int) 3; 4 5INSERT INTO posts 6 (`ID`, `data`, `a`, `b`) 7VALUES 8 (1, 'あ', 1, 1), 9 (2, 'い', 2, 3), 10 (3, 'う', 3, 3), 11 (4, 'え', 1, 4) 12; 13 14SELECT * 15FROM posts 16WHERE a IN ( 1, 2 ) 17 OR b IN ( 1, 2 ) 18;
試したこと
PHPを使っているので、WHERE a IN ( 1, 2 )
のクエリと、WHERE b IN ( 1, 2 )
のクエリに分け2回実行すれば判別はできるのですが…もしできれば1回に済ませたいと考えています。
そこで考えたのが次のクエリですが、CASE~WHEN
が多すぎてなんとも…な感じです。
sql
1SELECT 2 3 CASE WHEN a=1 AND b!=1 THEN 'a' 4 WHEN a=1 AND b=1 THEN 'a,b' 5 WHEN a=2 AND b!=2 THEN 'a' 6 WHEN a=2 AND b=2 THEN 'a,b' 7 END AS 'roots', 8 9 x.* 10 11FROM ( 12 SELECT * 13 FROM posts 14 WHERE a IN ( 1, 2 ) 15 OR b IN ( 1, 2 ) 16) AS x 17;
このようにCASE~WHEN
をべたべたと書かずとも、正式な方法というか、見やすい方法はないものでしょうか?
ツールのバージョン
MySQL 5.7 になります。
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー