我想在mysql上对具有60列以上的表进行查询,并垂直列出这些列,以便它们的值水平运行。有点像describe table,但是在每一列之后列出了几行,而不是该列的描述。我的表有4个字母的隐式列名,通过表描述和常规查询很难理解它们。我想描述表并在它们之后得到几个行值。本质上,只需将整个桌子逆时针旋转90度即可。
我已经四处搜寻,但找不到简单的方法来完成此操作。
-- basically, this would do:
SELECT * FROM BIG_TABLE LIMIT 2 ROTATE_LEFT 90;
COLUMN 1 | VALUE_1 | VALUE_2
COLUMN 2 | VALUE_1 | VALUE_2
COLUMN 3 | VALUE_1 | VALUE_2
COLUMN 4 | VALUE_1 | VALUE_2
COLUMN 5 | VALUE_1 | VALUE_2
COLUMN 6 | VALUE_1 | VALUE_2
COLUMN 7 | VALUE_1 | VALUE_2
COLUMN 8 | VALUE_1 | VALUE_2
-- instead of the normal:
SELECT * FROM BIG_TABLE LIMIT 2;
COLUMN 1 | COLUMN 2 | COLUMN 3 | COLUMN 4 | COLUMN 5 | COLUMN 6 ....
VALUE_1 | VALUE_1 | VALUE_1 | VALUE_1 | VALUE_1 | VALUE_1 ....
VALUE_2 | VALUE_2 | VALUE_2 | VALUE_2 | VALUE_2 | VALUE_2 ....
答案 0 :(得分:1)
假设所有六十列的数据类型都是兼容的,我们可以这样做。
SELECT c.colname
, CASE c.colname
WHEN 'c1' THEN v1.`c1`
WHEN 'c2' THEN v1.`c2`
WHEN 'c3' THEN v1.`c3`
WHEN 'c4' THEN v1.`c4`
WHEN 'c5' THEN v1.`c5`
...
END AS `value 1`
, CASE c.colname
WHEN 'c1' THEN v2.`c1`
WHEN 'c2' THEN v2.`c2`
WHEN 'c3' THEN v2.`c3`
WHEN 'c4' THEN v2.`c4`
WHEN 'c5' THEN v2.`c5`
...
END AS `value 2`
FROM ( SELECT 1 AS seq, 'c1' AS colname
UNION ALL SELECT 2, 'c2'
UNION ALL SELECT 3, 'c3'
UNION ALL SELECT 4, 'c4'
UNION ALL SELECT 5, 'c5'
...
) c
CROSS
JOIN ( SELECT * FROM BIG_TABLE ORDER BY ... LIMIT 0,1 ) v1
CROSS
JOIN ( SELECT * FROM BIG_TABLE ORDER BY ... LIMIT 1,1 ) v2
ORDER
BY c.seq
请注意,列名(c1
,c2
,c3
)必须进行硬编码以及应返回的顺序。
如果我们需要动态更改列名,则需要一个单独的SQL语句来检索列名列表(information_schema.columns),然后使用检索到的信息来动态构建一条语句,就像上面的语句一样。