前提
どの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
CREATE TABLE posts (`ID` int, `data` varchar(10), `a` int, `b` int) ; INSERT INTO posts (`ID`, `data`, `a`, `b`) VALUES (1, 'あ', 1, 1), (2, 'い', 2, 3), (3, 'う', 3, 3), (4, 'え', 1, 4) ; SELECT * FROM posts WHERE a IN ( 1, 2 ) OR b IN ( 1, 2 ) ;
試したこと
PHPを使っているので、WHERE a IN ( 1, 2 )
のクエリと、WHERE b IN ( 1, 2 )
のクエリに分け2回実行すれば判別はできるのですが…もしできれば1回に済ませたいと考えています。
そこで考えたのが次のクエリですが、CASE~WHEN
が多すぎてなんとも…な感じです。
sql
SELECT CASE WHEN a=1 AND b!=1 THEN 'a' WHEN a=1 AND b=1 THEN 'a,b' WHEN a=2 AND b!=2 THEN 'a' WHEN a=2 AND b=2 THEN 'a,b' END AS 'roots', x.* FROM ( SELECT * FROM posts WHERE a IN ( 1, 2 ) OR b IN ( 1, 2 ) ) AS x ;
このようにCASE~WHEN
をべたべたと書かずとも、正式な方法というか、見やすい方法はないものでしょうか?
ツールのバージョン
MySQL 5.7 になります。
宜しくお願い致します。
まだ回答がついていません
会員登録して回答してみよう