- ベストアンサー
SQLにて順列の抽出
MySQLにてSELECT文にて順列の抽出をしようと試みていますが、順列を出すためのSQL文がわからず困っています。 TABLE1 +-----+-----+-----+-----+ | NUM | A | B | C | +-----+-----+-----+-----+ | 101 | 0 | 4 | 9 | +-----+-----+-----+-----+ | 102 | 2 | 2 | 0 | +-----+-----+-----+-----+ 例えば上記の様なテーブルがあって、NUM=101のA,B,Cを取り出して 049 094 409 490 904 940 のような順列を作り出してPHPから渡した変数D(仮にvar=409)と照らし合わせようと試みていますが、1つの行の中の数字で順列を抽出するSQL文がわからず困っていますので、ご教授願います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
バージョンにもよりますが、サブクエリーが使えるなら、次のような解はどうでしょう? select T0.a,T1.a,T2.a from ( select a as a from ttt where num = 101 union select b as a from ttt where num = 101 union select c from ttt where num = 101) as T0, ( select a as a from ttt where num = 101 union select b as a from ttt where num = 101 union select c from ttt where num = 101) as T1, ( select a as a from ttt where num = 101 union select b as a from ttt where num = 101 union select c from ttt where num = 101) as T2 where T0.a <> T1.a and T0.a <> T2.a and T1.a <> T2.a;
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
データの持たせ方を換えられませんか? CREATE TABLE `TABLE1`( NUM char(3) NOT NULL ,NAME varchar(10) ,DATA char(1) ); INSERT INTO `TABLE1` VALUES ('101','A','0') ,('101','B','4') ,('101','C','9') ,('102','A','0') ,('102','B','2') ,('102','C','2'); つまり NUM NAME DATA 101 A 0 101 B 4 101 C 9 102 A 0 102 B 2 102 C 2 こんな構造でしたら、積をとって簡単に取り出せます SELECT t1.NUM,CONCAT(t1.DATA,t2.DATA,t3.DATA) AS `ABC` FROM `TABLE1` as t1 INNER JOIN `TABLE1` as t2 ON t1.NUM=t2.NUM AND t2.NAME!=t1.NAME INNER JOIN `TABLE1` as t3 ON t1.NUM=t3.NUM AND t3.NAME!=t1.NAME AND t3.NAME!=t2.NAME
お礼
データの持たせ方を変える権限がないのでこのままでいこうと思います。アドバイスありがとうございました。
- little-m
- ベストアンサー率44% (45/102)
ANo.2です。 すみません。and 抜けました。 (a = substring($key, 1, 1) and b = substring($key, 2, 1) c = substring($key, 3, 1)) ↓ (a = substring($key, 1, 1) and b = substring($key, 2, 1) and c = substring($key, 3, 1))
お礼
ありがとうございました。
- little-m
- ベストアンサー率44% (45/102)
配列が3程度まででよければ、地道に以下のSQLで良いのでは? $key = '409'; select num from table1 where (a = substring($key, 1, 1) and b = substring($key, 2, 1) c = substring($key, 3, 1)) or (b = substring($key, 1, 1) and c = substring($key, 2, 1) a = substring($key, 3, 1)) or (c = substring($key, 1, 1) and a = substring($key, 2, 1) b = substring($key, 3, 1)) 必要に応じて order by a, b, c
お礼
ありがとうございます。 サーバ2つで行っていますが、一方がサブクエリ無効なので少し残念でした