Спасибо за вашу помощь, ребята, я подхожу к решению!
@ jmucchiello: Я не ищу проверки на стороне PHP. Я хочу, чтобы MySQL делал всю работу, так как я буду использовать ее во многих других SQL-запросах.
Другими словами, я хочу сделать этот запрос, сохранить его в виде, чтобы иметь упрощенный способ получения переведенных описаний моих продуктов. Что-то вроде: descriptionView.
Я бы тогда использовал это так:
SELECT * FROM descriptionView WHERE lang_code = "en" AND product_id = 80007
Прямо сейчас вот что у меня есть:
SELECT
descriptions.code,
IFNULL(t1.label, t2.label) AS label,
IFNULL(t1.short_description, t2.short_description) AS short_description,
IFNULL(t1.long_description, t2.long_description) AS long_description
FROM
descriptions
LEFT JOIN
translations t1
ON
t1.description_id = descriptions.id AND t1.lang_id =
(
SELECT
id
FROM
languages
WHERE
code = "fr"
)
LEFT JOIN
translations t2
ON
t2.description_id = descriptions.id AND t2.is_default = 1
WHERE
descriptions.id = 1
Работает нормально, однако мне нужно удалить жестко закодированные «1» и «fr», потому что я хочу преобразовать их в представление, которое соберет все записи, а затем выполнить выборку для этого представления.
Проблема в том, что по какой-то причине я не могу изменить первое левое соединение на:
LEFT JOIN
translations t1
ON
t1.description_id = descriptions.id AND t1.lang_id = languages.id
и добавить языки в предложении FROM.
Наконец, я бы удалил предложение WHERE, так как мне нужен весь результат.
Таким образом, мой последний запрос будет выглядеть так:
CREATE VIEW descriptionView AS
SELECT
languages.code as lang,
descriptions.code,
IFNULL(t1.label, t2.label) AS label,
IFNULL(t1.short_description, t2.short_description) AS short_description,
IFNULL(t1.long_description, t2.long_description) AS long_description
FROM
descriptions,
languages
LEFT JOIN
translations t1
ON
t1.description_id = descriptions.id AND t1.lang_id = languages.id
LEFT JOIN
translations t2
ON
t2.description_id = descriptions.id AND t2.is_default = 1
Затем я могу запросить это представление, используя:
SELECT * FROM descriptionView WHERE lang_code = "en" AND product_id = 80007