残念ながら、あなたはそれのために何ができるには直接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は呼ばれ
クエリを動的に構築する必要があります。ここではそれが行く:
ステップ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;
除外リストとしてこれを使うfはありません、それは存在せず、それは意味をなさない。 group by節で言及されていない集計されていない列で得られる値は、必然的にランダムであり、したがって役に立たないでしょう。 – Mchl
これは、group by節のすべての値を記述し、除外のみを指定することが可能かどうかを確認しようとしている理由です。私は乱数を扱うことができます。 – Smartelf
とにかくこのような構文はMySQLではありません。 – Mchl