MySQL: «ВЫБЕРИТЕ текст как <ЗДЕСЬ ПЕРЕМЕННАЯ ИЛИ ПОДЗАПРОС> ОТ ......».

У меня есть следующая таблица со следующими данными внутри:

я бытекстязык
1немецкий текстНемецкий
2английский текстанглийский

Я хочу получить результат в следующем формате:

german="deutscher text"
english="english text"

Этот менас должен быть нет:

text="deutscher text"
text="english text"

Имя ключа/столбца text должно быть данными из language

Я попробовал следующий запрос, но он не работает:

SELECT text as (SELECT language FROM `table` where id = 1) FROM `table` where id = 1;

(SELECT language FROM table where id = 1) вернет «немецкий», поэтому запрос должен быть: "ВЫБРАТЬ текст как немецкий ОТ table, где id = 1;" но это не работает.

Есть ли способ сделать это в одном запросе?

Привет, Томас

Нет, вычислить метки в SQL невозможно. Вам нужно будет использовать динамический SQL в хранимой процедуре, используя PREPARE и EXECUTE.

Barmar 22.04.2022 23:39
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
1
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам придется немного изменить схему таблицы; Добавлена ​​ссылка для группировки используемых языков.

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ref` int(11) DEFAULT 0,
  `text` varchar(50) DEFAULT NULL,
  `language` varchar(50) DEFAULT NULL,
  KEY `Index 1` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3;

Затем SQL

SELECT T.text AS english, T2.text AS german
FROM test T 
INNER JOIN test T2 ON T.ref = T2.ref AND T2.`language` = 'german'
WHERE 
    T.ref = 1 AND
    T.language = 'english'

фиктивные данные

INSERT INTO `test` (`id`, `ref`, `text`, `language`) VALUES
    (1, 1, 'deutscher text', 'german'),
    (2, 1, 'english text', 'english');

Привет! Данные могут иметь много разных языков, которых я не знаю. Вот почему я хочу использовать его как переменную и назначить ее в команде выбора: `SELECT T.text AS <HERE THE VARIABLE>"

Thomas 23.04.2022 15:07
Ответ принят как подходящий

Один из вариантов, который вы можете использовать, это PREPARED STATEMENT:

SET @sql := NULL;

SELECT GROUP_CONCAT(
           CONCAT('MAX(CASE WHEN language="',language,'" THEN text END) AS "',language,'"')) 
         INTO @sql
FROM mytable;

SELECT CONCAT('SELECT ',@sql,' FROM mytable;') INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Первый шаг — динамическое назначение столбцов, необходимых для переменной @sql. Затем, объединив ранее назначенную переменную @sql с остальной частью окончательного SELECT запроса, затем повторно назначив ее переменной @sql. Запрос закончится:

SELECT MAX(CASE WHEN language="german" THEN text END) AS "german",
       MAX(CASE WHEN language="english" THEN text END) AS "english" 
FROM mytable;

Наконец, мы подготавливаем, выполняем, затем освобождаем оператор, назначенный в переменной @sql, и вы получите ожидаемый результат.

Демонстрационная рабочий пример

Другие вопросы по теме