2012-02-21 4 views
1

MySQLに関する簡単な質問。 Ff私は例として のような列があるテーブルを持っています。とにかくSELECT a、b、..、f、sum(num)GROUP BYのようなことができます。 、b、..、f そのグループをリストでリストに追加しないでください。私がこれをやりたいのは、私がグループに含まれたくないフィールドの配列を持つことになり、空のときにすべてのフィールドでグループ化したいからです。グループごとに文を逆転させるのは可能でしょうか?

本質的には、(a、c、e)を含む配列がある場合 このようなクエリを生成したいと思います。SELECT a、b、c、d、e、f、sum(num) 、d、f などですが、SELECT a、b、c、d、e、fのようなものを逆a、c、e、sumでグループ化すると

このような構文がありますか?

おかげ

+0

除外リストとしてこれを使うfはありません、それは存在せず、それは意味をなさない。 group by節で言及されていない集計されていない列で得られる値は、必然的にランダムであり、したがって役に立たないでしょう。 – Mchl

+0

これは、group by節のすべての値を記述し、除外のみを指定することが可能かどうかを確認しようとしている理由です。私は乱数を扱うことができます。 – Smartelf

+0

とにかくこのような構文はMySQLではありません。 – Mchl

答えて

0

残念ながら、あなたはそれのために何ができるには直接SQLはありません。

ただし、information_schema.columns

mysql> desc information_schema.columns; 
+--------------------------+---------------------+------+-----+---------+-------+ 
| Field     | Type    | Null | Key | Default | Extra | 
+--------------------------+---------------------+------+-----+---------+-------+ 
| TABLE_CATALOG   | varchar(512)  | NO |  |   |  | 
| TABLE_SCHEMA    | varchar(64)   | NO |  |   |  | 
| TABLE_NAME    | varchar(64)   | NO |  |   |  | 
| COLUMN_NAME    | varchar(64)   | NO |  |   |  | 
| ORDINAL_POSITION   | bigint(21) unsigned | NO |  | 0  |  | 
| COLUMN_DEFAULT   | longtext   | YES |  | NULL |  | 
| IS_NULLABLE    | varchar(3)   | NO |  |   |  | 
| DATA_TYPE    | varchar(64)   | NO |  |   |  | 
| CHARACTER_MAXIMUM_LENGTH | bigint(21) unsigned | YES |  | NULL |  | 
| CHARACTER_OCTET_LENGTH | bigint(21) unsigned | YES |  | NULL |  | 
| NUMERIC_PRECISION  | bigint(21) unsigned | YES |  | NULL |  | 
| NUMERIC_SCALE   | bigint(21) unsigned | YES |  | NULL |  | 
| CHARACTER_SET_NAME  | varchar(32)   | YES |  | NULL |  | 
| COLLATION_NAME   | varchar(32)   | YES |  | NULL |  | 
| COLUMN_TYPE    | longtext   | NO |  | NULL |  | 
| COLUMN_KEY    | varchar(3)   | NO |  |   |  | 
| EXTRA     | varchar(27)   | NO |  |   |  | 
| PRIVILEGES    | varchar(80)   | NO |  |   |  | 
| COLUMN_COMMENT   | varchar(1024)  | NO |  |   |  | 
+--------------------------+---------------------+------+-----+---------+-------+ 
19 rows in set (0.05 sec) 

のは、あなたがそれらの列がinformation_schema.columnsに存在するテーブルtest.customers

mysql> desc test.customers; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| companyname | varchar(30) | YES |  | NULL |    | 
| address  | varchar(40) | YES |  | NULL |    | 
| phone  | char(12)  | NO |  | NULL |    | 
| email  | varchar(100) | YES |  | NULL |    | 
| contact  | varchar(100) | YES |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 
6 rows in set (0.02 sec) 

を持っているとしましょうを使用して、いくつかの動的SQLを試行することができます。あなたはそれらを取り出すことができます

SELECT GROUP_CONCAT(column_name) column_list FROM information_schema.columns 
WHERE table_schema='test' AND table_name='customers'; 

それはあなたに与え、この:

mysql> SELECT GROUP_CONCAT(column_name) column_list FROM information_schema.columns 
    -> WHERE table_schema='test' AND table_name='customers'; 
+--------------------------------------------+ 
| column_list        | 
+--------------------------------------------+ 
| id,companyname,address,phone,email,contact | 
+--------------------------------------------+ 
1 row in set (0.01 sec) 

のは、あなたがいない(ID、会社名、電話、電子メール)のすべてを取得したいとしましょう。

あなたはこのようにそれを照会することができます:

SELECT GROUP_CONCAT(A.column_name) column_list 
FROM 
(
    SELECT column_name 
    FROM information_schema.columns 
    WHERE table_schema='test' 
    AND table_name='customers' 
) A 
LEFT JOIN 
(
    SELECT 'id' column_name 
    UNION SELECT 'companyname' 
    UNION SELECT 'phone' 
    UNION SELECT 'email' 
) exclusion 
USING (column_name) 
WHERE exclusion.column_name IS NULL; 

それはあなたを与えるものを見て:

mysql> SELECT GROUP_CONCAT(A.column_name) column_list 
    -> FROM 
    -> (
    ->  SELECT column_name 
    ->  FROM information_schema.columns 
    ->  WHERE table_schema='test' 
    ->  AND table_name='customers' 
    ->) A 
    -> LEFT JOIN 
    -> (
    -> SELECT 'id' column_name 
    -> UNION SELECT 'companyname' 
    -> UNION SELECT 'phone' 
    -> UNION SELECT 'email' 
    ->) exclusion 
    -> USING (column_name) 
    -> WHERE exclusion.column_name IS NULL; 
+-----------------+ 
| column_list  | 
+-----------------+ 
| address,contact | 
+-----------------+ 
1 row in set (0.02 sec) 

OK、どのようにあなたが探しているクエリを構築するのですか?

のは、あなたのテーブルは、それが列、B、C、D、E、F、NUM

  • あなたが逆を実行したいがありmydbというデータベース
  • にmytableは呼ばれ

    • を言ってみましょうa、c、e、num

    クエリを動的に構築する必要があります。ここではそれが行く:

    ステップ01)、C、E、NUM

    SELECT 'a' column_name 
    UNION SELECT 'c' 
    UNION SELECT 'e' 
    UNION SELECT 'num'; 
    

    ステップ02の除外リストを作成します)MYDBに対して除外リストを使用するクエリを作成します。mytableは

    SELECT GROUP_CONCAT(A.column_name) column_list 
    FROM 
    (
        SELECT column_name 
        FROM information_schema.columns 
        WHERE table_schema='mydb' 
        AND table_name='mytable' 
    ) A 
    LEFT JOIN 
    (
        SELECT 'a' column_name 
        UNION SELECT 'c' 
        UNION SELECT 'e' 
        UNION SELECT 'num' 
    ) exclusion 
    USING (column_name) 
    WHERE exclusion.column_name IS NULL; 
    

    ステップ03)、ステップ04

    SELECT GROUP_CONCAT(A.column_name) 
    INTO @gbc 
    FROM 
    (
        SELECT column_name 
        FROM information_schema.columns 
        WHERE table_schema='mydb' 
        AND table_name='mytable' 
    ) A 
    LEFT JOIN 
    (
        SELECT 'a' column_name 
        UNION SELECT 'c' 
        UNION SELECT 'e' 
        UNION SELECT 'num' 
    ) exclusion 
    USING (column_name) 
    WHERE exclusion.column_name IS NULL; 
    

    (GBCは、列ごとのグループである)変数に出力をキャプチャして)あなたの完全なクエリ

    SET @s = CONCAT('SELECT a,b,c,d,e,f,sum(num) from mydb.mytable group by ',@gbc); 
    

    ステップ05の作成)を実行動的SQL

    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    

    それは試してみる!

    CAVEAT

    あなたは、B、C、D、E、グループにすべての列をしたい場合は、単に

    SELECT GROUP_CONCAT(A.column_name) 
    INTO @gbc 
    FROM 
    (
        SELECT column_name 
        FROM information_schema.columns 
        WHERE table_schema='mydb' 
        AND table_name='mytable' 
    ) A 
    LEFT JOIN 
    (
        SELECT 'a' column_name 
    ) exclusion 
    USING (column_name) 
    WHERE exclusion.column_name IS NULL; 
    
  • 関連する問題