Использовать текстовое содержимое из ячейки в качестве переменной столбца в том же запросе JOIN - PullRequest
0 голосов
/ 13 марта 2020

У меня есть система с переводами, и я хочу получить количество переведенных сообщений в том же запросе, что и сам язык, чтобы создать сообщение типа «Перевод 134/943 строк».

Поэтому я сначала получите язык и заголовок, сохраненный в languages -таблице, а затем LEFT JOIN общее количество существующих строк.

Теперь в третьей строке следующего кода моя проблема: В основном я хочу чтобы получить значение из ячейки из a.language и вставить его в запрос для подсчета переведенных строк.

SELECT a.`language`, a.`title`, b.`total`, c.`translated` FROM `languages` a 
LEFT JOIN (SELECT COUNT(*) as `total` FROM `translations` WHERE 1) b ON 1 
LEFT JOIN (SELECT COUNT(*) as `translated` FROM `translations` WHERE `(a.`language`)` IS NOT NULL) c ON 1

Замена ("языка") на значение из таблицы `languages`.

Таким образом, третья строка должна заканчиваться

WHERE `en_gb` IS NOT NULL

для английского языка sh и

WHERE `de_de` IS NOT NULL

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

Мои таблицы выглядят так:

languages:

| language |  title  |
|----------|---------|
|  de_de   | German  |
|  en_gb   | English |

translations:

|    key     |   de_de    |     en_gb    |
|------------|------------|--------------|
| main.hello |  Hallo!    |   Hello!     |
| main.bye   |  Tschüss!  |   Bye!       |
| main.what  |  Was?      |   *NULL*     |

В этой спецификации ifi c case мой запрос должен вывести следующий результат:

|  language  |  title   |   total   |  translated   |
|------------|----------|-----------|---------------| 
|  de_de     | German   |    3      |     3         |
|  en_gb     | English  |    3      |     2         |

, потому что есть одна строка, которая еще не переведена.

Есть ли способ сделать это или я нужно создать два запроса: один с запросом на языки, а затем для каждого языка с запросом, сколько строк уже переведено?

1 Ответ

0 голосов
/ 13 марта 2020

@ NicolaUetz Я согласен с @HoneyboyWilson, с вашими текущими структурами таблиц единственный способ сделать это sh - это с помощью Dynami c sql.

Я знаю, что это не тот ответ, который вы искали, но вместо того, чтобы попытаться сделать что-то ненормальное, чтобы заставить это работать, если это возможно, я бы настоятельно рекомендовал изменить структуру ваших таблиц. Я бы изменил таблицу translations на 3 столбца:

language | key | translation

, где язык является внешним ключом к столбцу language в таблице languages, key - это слово для перевода, а translation - это перевод это слово в язык.

Вот код для создания таких таблиц и заполнения их данными:

CREATE TABLE `languages` (`language` TEXT, `title` TEXT);

CREATE TABLE `translations` (`language` TEXT, `key` TEXT, `translation` TEXT);

INSERT INTO `languages` (`language`, `title`)
VALUES
('de_de', 'German'),
('en_gb', 'English');

INSERT INTO `translations` (`language`, `key`, `translation`)
VALUES
('de_de', 'hello', 'Hallo!'),
('en_gb', 'hello', 'Hello!'),
('de_de', 'bye', 'Tschuss!'),
('en_gb', 'bye', 'Bye!'),
('de_de', 'what', 'Was?');

А вот запрос, который вы запустите, чтобы получить результаты, которые вы ищете:

SELECT `a`.`language`, 
    `a`.`title`,
    COUNT(`t`.`translation`) AS `translated`
FROM `languages` AS `a`
LEFT JOIN `translations` AS `t` ON `t`.`language` = `a`.`language`
GROUP BY `a`.`language`, `a`.`title`;

Вот пример для db-fiddle;

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

Если невозможно изменить структуру таблицы, то Dynami c sql является единственным вариантом.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...