MySQL не может делать то, что вы хотите, в одном запросе.Когда вы готовите запрос, все ссылки на столбцы должны быть исправлены.
Лучшее, что вы можете сделать, - это использовать один запрос к INFORMATION_SCHEMA для создания нового динамического SQL-запроса, который получаетинформация, которую вы хотите.
Я проверил это на MySQL 5.5.16:
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_SCHEMA, TABLE_NAME) = ('test', 'tt')
AND COLUMN_NAME IN ('a', 'b', 'c');
Этот запрос выдает следующий результат (я добавил новые строки для публикации здесь):
(SELECT 'a' AS `column`, LENGTH(`a`) AS `length`, id
FROM `test`.`tt` ORDER BY `length` DESC LIMIT 1)
UNION ALL
(SELECT 'b' AS `column`, LENGTH(`b`) AS `length`, id
FROM `test`.`tt` ORDER BY `length` DESC LIMIT 1)
UNION ALL
(SELECT 'c' AS `column`, LENGTH(`c`) AS `length`, id
FROM `test`.`tt` ORDER BY `length` DESC LIMIT 1);
Сгенерированный запрос возвращает следующий результат в моем тесте:
+--------+--------+----+
| column | length | id |
+--------+--------+----+
| a | 10 | 2 |
| b | 9 | 1 |
| c | 6 | 2 |
+--------+--------+----+
Обратите внимание, что это не разрешает связи.Если несколько строк имеют одинаковую самую длинную строку, она сообщит только один id
, выбранный произвольно.
Ваш дополнительный вопрос:
Вы должны выполнить их как два отдельных запроса. В начале своего ответа я сказал, что ссылки на столбцы должны быть исправленыв строке SQL во время подготовки вашего запроса.Вы не можете обнаружить столбцы динамически, а также запросить их данные в том же запросе.
Ваш комментарий:
Самая длинная строка, возвращаемая GROUP_CONCAT (), по умолчанию равна 1024что достаточно только для генерации этого SQL-запроса для 9 столбцов.Вы можете увеличить это ограничение:
SET group_concat_max_len = 1024*1024;
Это увеличивает ограничение только для текущего сеанса базы данных.Вы можете использовать SET GLOBAL ...
, чтобы изменить его для всех сессий.Если вы хотите, чтобы это сохранялось после перезапуска MySQL, установите значение в вашем файле my.cnf (не нужно использовать SET GLOBAL
в файле конфигурации).