#mysql #postgresql
#mysql #postgresql
Вопрос:
Этот запрос отлично работает в MySQL, но не в PostgreSQL:
select
concat(hc.id, hl.languagecode) AS id,
hc.id AS category_id,
hl.languagecode AS languagecode
from language hl
join category hc
left join categorytranslation hct ON hl.languagecode = hct.languagecode and hc.id = hct.category_id;
В PostgreSQL я иногда получал ошибку:
ОШИБКА: синтаксическая ошибка в конце СТРОКИ ввода 9: ….languagecode = hct.languagecode и hc.id = hct.category_id ^ Ошибка запроса PostgreSQL сказал: синтаксическая ошибка в конце ввода
Или пустой результат. Я использую Postico для его тестирования.
Что с ним не так?
Что я хочу сделать, так это получить результат этого:
select
concat(hc.id, hl.languagecode) AS id,
hc.id AS category_id,
hl.languagecode AS languagecode,
hc.slug AS slug
from category hc, language hl
Но я также хочу присоединиться к таблице с переводом ‘categorytranslation’. Если доступен перевод, который следует использовать вместо таблицы «категория». Для этого я изменил запрос следующим образом:
SELECT
concat(hp.id, hl.languagecode) AS id,
hp.id AS id,
hl.languagecode AS languagecode,
hpt.languagecode as translang,
CASE WHEN (hpt.languagecode is not null and hpt.slug is not null and trim(hpt.slug) <> '')
THEN hpt.slug
ELSE hp.slug
END AS slug,
from language hl
join category hc
left join categorytranslation hct ON hl.languagecode = hct.languagecode and hc.id = hct.category_id;
Комментарии:
1. Условие соединения выглядит немного странно, поскольку вы выполняете перекрестное соединение между таблицами
language
иcategory
. Это правильно?
Ответ №1:
В PostgreSQL для каждого соединения требуется фраза условия соединения. В вашем запросе отношения между таблицами выглядят так hl -> hct -> hc
; затем запрос становится:
SELECT hc.id || languagecode AS id,
hc.id AS category_id,
languagecode
FROM language hl
LEFT JOIN hapis_hatracocategorytranslation hct USING (languagecode)
JOIN category hc ON hc.id = hct.category_id;
Обратите внимание, что при использовании USING
фразы в первом условии соединения нет двусмысленности между languagecode
столбцами из обеих таблиц, поэтому вы можете опустить псевдоним в списке выбора.
Комментарии:
1. Спасибо за ваш ответ. Это работает до сих пор, но результат возвращает результаты только для одного «languagecode». Таблица «язык» содержит 5 языков. Поля: id, active, languagecode