我的表就像
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 ;
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);
这里我想提取给定catID的值为1的字段名称。任何人都可以帮我如何在mysql中编写这个查询吗?
我尝试了来自价格范围的SHOW FIELDS,但它显示了所有字段名称,其详细信息不涉及值, SELECT * from pricerange 但它需要一些php操作。但我只想在MYSQL中编写它。
答案 0 :(得分:1)
解决此问题的关键是使用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>
试一试!!!
答案 1 :(得分:0)
我不认为SQL是该任务的正确工具(给定您的表结构),更容易阅读整个记录并在客户端获取名称。但是也可以使用sql。想法是不透明的:
SELECT 'Below 500' as field1
FROM pricerange where catID = 1 AND `Below 500` is not null
UNION ALL
SELECT '501-1000' as field1
FROM pricerange where catID = 1 AND `501-1000` is not null
等。
答案 2 :(得分:0)
也许你想使用case语句......例如
select case "Below 500" when 1 then "Below 500" else "" end,
case "501-1000" when 1 then "501-1000" else "" end, etc...
答案 3 :(得分:0)
您可以使用以下内容:
SELECT
GROUP_CONCAT( (IF `Below 500`=1, `Below 500`, ''), (IF `501-1000`=1, `501-1000`, ''),...)
FROM `pricerange`
WHERE `catID`=myCatID
但是如果可能的话我会改变那个数据库架构。创建一个单独的表并记录每个价格区间。