この問題を解決するための鍵は、information_schemaを使用することです。
これがあなたへの質問です:
SELECT A.column_name FROM
(select ordinal_position-3 pos,column_name from information_schema.columns
where table_name='pricerange' and LOCATE('-',column_name)) A
INNER JOIN
(SELECT CONCAT(`501-1000`,`1001-2000`,`2001-3000`,
`3001-4000`,`4001-5000`,`5001-6000`,`6001-7000`,
`7001-8000`,`8001-9000`,`9001-10000`,
`10001-100000`) bitmap FROM pricerange) B
ON SUBSTR(bitmap,pos,1) = '1';
私はあなたのデータをロードしました
mysql> DROP DATABASE IF EXISTS sumant;
Query OK, 1 row affected (0.06 sec)
mysql> CREATE DATABASE sumant;
Query OK, 1 row affected (0.00 sec)
mysql> USE sumant
Database changed
mysql> CREATE TABLE IF NOT EXISTS `pricerange` (
-> `priceRangeID` int(11) NOT NULL AUTO_INCREMENT,
-> `catID` int(11) NOT NULL,
-> `Below 500` tinyint(1) NOT NULL DEFAULT '0',
-> `501-1000` tinyint(1) NOT NULL DEFAULT '0',
-> `1001-2000` tinyint(1) NOT NULL DEFAULT '0',
-> `2001-3000` tinyint(1) NOT NULL DEFAULT '0',
-> `3001-4000` tinyint(1) NOT NULL DEFAULT '0',
-> `4001-5000` tinyint(1) NOT NULL DEFAULT '0',
-> `5001-6000` tinyint(1) NOT NULL DEFAULT '0',
-> `6001-7000` tinyint(1) NOT NULL DEFAULT '0',
-> `7001-8000` tinyint(1) NOT NULL DEFAULT '0',
-> `8001-9000` tinyint(1) NOT NULL DEFAULT '0',
-> `9001-10000` tinyint(1) NOT NULL DEFAULT '0',
-> `10001-100000` tinyint(1) NOT NULL DEFAULT '0',
-> `above 100000` tinyint(1) NOT NULL DEFAULT '0',
-> PRIMARY KEY (`priceRangeID`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Query OK, 0 rows affected (0.17 sec)
mysql> INSERT INTO `pricerange` (`priceRangeID`, `catID`, `Below 500`, `501-1000`, `1001-2000`, `2001-3000`, `3001-4000`, `4001-5000`, `5001-6000`, `6001-7000`, `7001-8000`, `8001-9000`, `9001-10000`, `10001-100000`, `above 100000`) VALUES
-> (1, 3, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1);
Query OK, 1 row affected (0.07 sec)
mysql>
実行されるクエリは次のとおりです。
mysql> SELECT A.column_name FROM
-> (select ordinal_position-3 pos,column_name from information_schema.columns
-> where table_name='pricerange' and LOCATE('-',column_name)) A
-> INNER JOIN
-> (SELECT CONCAT(`501-1000`,`1001-2000`,`2001-3000`,
-> `3001-4000`,`4001-5000`,`5001-6000`,`6001-7000`,
-> `7001-8000`,`8001-9000`,`9001-10000`,
-> `10001-100000`) bitmap FROM pricerange) B
-> ON SUBSTR(bitmap,pos,1) = '1';
+--------------+
| column_name |
+--------------+
| 5001-6000 |
| 6001-7000 |
| 9001-10000 |
| 10001-100000 |
+--------------+
4 rows in set (0.02 sec)
mysql>
また、逆に機能します。これは同じクエリですが、ゼロのみを探します。
mysql> SELECT A.column_name FROM
-> (select ordinal_position-3 pos,column_name from information_schema.columns
-> where table_name='pricerange' and LOCATE('-',column_name)) A
-> INNER JOIN
-> (SELECT CONCAT(`501-1000`,`1001-2000`,`2001-3000`,
-> `3001-4000`,`4001-5000`,`5001-6000`,`6001-7000`,
-> `7001-8000`,`8001-9000`,`9001-10000`,
-> `10001-100000`) bitmap FROM pricerange) B
-> ON SUBSTR(bitmap,pos,1) = '0';
+-------------+
| column_name |
+-------------+
| 501-1000 |
| 1001-2000 |
| 2001-3000 |
| 3001-4000 |
| 4001-5000 |
| 7001-8000 |
| 8001-9000 |
+-------------+
7 rows in set (0.01 sec)
mysql>
試してみる !!!