【发布时间】:2017-01-26 00:47:03
【问题描述】:
我有一个 n 列 x 行的表格。
我想进行查询以显示包含所有列的表以及该列的最大长度值(以及该行的最大长度值的行 ID)。
+--------+--------+----+
| column | length | id |
+--------+--------+----+
| a | 123 | 1 |
| b | 123 | 8 |
| c | 123 | 6 |
| d | 123 | 5 |
| e | 123 | 3 |
+--------+--------+----+
a、b、c 等是列名,length 是该列中的最大长度,id 是该列的最大值长度的行。
像这样的东西?但随后为所有列动态:
SELECT MAX(LENGTH(`column_a`)) AS `length`, `id`
FROM `table` GROUP BY LENGTH(`column_a`)
ORDER BY LENGTH(`column_a`) DESC LIMIT 1
就像在下一个查询中添加了两列(最大长度和行 ID)
SHOW COLUMNS FROM `table`
也许也使用这个查询来获取特定表的列名:
SELECT `column_name` AS `column`
FROM `information_schema`.`columns`
WHERE `table_name` = 'table'
AND `column_name` != 'id'
ORDER BY `ordinal_position`
差不多了(感谢 Bill)...(只需要指定 'table')但是现在如何运行 _SQL al 一样的运行...
SELECT CONCAT(GROUP_CONCAT(CONCAT('(SELECT \'', `column_name`,'\' AS `column`, LENGTH(`', `column_name`,'`) AS `length`, id ', 'FROM `', `table_schema`,'`.`', `table_name`,'` ORDER BY `length` DESC LIMIT 1)') SEPARATOR ' UNION ALL '), ';') AS _SQL
FROM `information_schema`.`columns`
WHERE `table_name` = 'table'
AND `column_name` IN (
SELECT `column_name`
FROM `information_schema`.`columns`
WHERE `table_name` = 'table'
AND `column_name` != 'id'
ORDER BY `ordinal_position`);
【问题讨论】:
-
架构看起来格式不正确。你能描述一下这个应用程序吗,或者这只是一个智力练习?当列名是数据时,这是一个不好的信号,不适合 RDBMS。
-
“智力练习”听起来不错,但它是用于监控值长度的。起初我以为这只是一个简单的查询,我无法做出/找到/提出。但现在这似乎是一项艰巨的任务。比尔此时给出了最好的解决方案,尽管我目前无法在同一运行中运行创建的查询。