1

私のテーブルは

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でこのクエリを書く方法を教えてもらえますか?

私はpricerangeからSHOWFIELDSを試しましたが、値を処理しない詳細を含むすべてのフィールド名、pricerangeからのSELECT *が表示されますが、いくつかのphp操作が必要です。しかし、私はそれをMYSQLだけで書きたいと思っています。

4

4 に答える 4

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>

試してみる !!!

于 2012-07-24T20:14:11.520 に答える
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

于 2012-07-24T19:35:04.973 に答える
0

たぶんあなたはcaseステートメントを使いたいでしょう...例えば

select case "Below 500" when 1 then "Below 500" else "" end, 
       case "501-1000" when 1 then "501-1000" else "" end, etc...
于 2012-07-24T19:38:00.103 に答える
0

次のようなものを使用できます。

SELECT
GROUP_CONCAT( (IF `Below 500`=1, `Below 500`, ''), (IF `501-1000`=1, `501-1000`, ''),...)
FROM `pricerange`
WHERE `catID`=myCatID

ただし、可能であれば、そのDBスキーマを変更します。個別のテーブルを作成し、価格間隔ごとにレコードを作成します。

于 2012-07-24T19:43:54.833 に答える