Проверка, существует ли значение в SQL и не возвращает ли другую строку - PullRequest
2 голосов
/ 11 октября 2011

У меня есть MySQL SQL-запрос, который выбирает продукты и текстовые переводы:

SELECT *
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations) t
ON t.id = p.product_id

Это берет продукты из базы данных. Однако он захватывает все доступные переводы. Я просто хочу получить переводы на текущем языке. Так что я могу использовать это:

SELECT *
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations WHERE lang = 'en') t
ON t.id = p.product_id

Это работает как задумано, однако не все продукты имеют перевод для каждого языка. В конечном итоге я хочу указать язык, и если перевода нет, вернуть все остальные имеющиеся у нас переводы. Это можно сделать в SQL или мне нужно будет перебрать результаты в PHP?

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Если вы создадите языковой перевод «по умолчанию» для каждого продукта и дадите ему код 'zz', сработает следующее.Для каждого продукта должен быть 'zz' перевод.

(Это заняло у меня буквально час, но я многому научился в процессе - отличный вопрос!).

SELECT *
FROM products p
LEFT JOIN translations t
ON (p.id == t.product_id
    AND (t.lang == 'en'
         OR (t.lang == 'zz' AND
             'en' NOT IN
             (SELECT `lang` FROM translations t2 WHERE t2.product_id == p.id)
            )
        )
   );

Извините, если это не эффективно.Вам нужно попробовать и посмотреть.

0 голосов
/ 11 октября 2011

Одним из методов является добавление еще одного LEFT JOIN, который извлекает первый перевод, доступный на любом языке для этого идентификатора продукта. Затем используйте оператор COALESCE, чтобы использовать вторичный перевод, если первый перевод (на желаемом языке) недоступен:

SELECT
    p.product_id,
    COALESCE(t.lang, t2.lang),
    COALESCE(t.translation, t2.translation)
FROM (select * from products) p
LEFT JOIN (SELECT * FROM translations WHERE lang = @lang) t
    ON t.id = product_id
LEFT JOIN (SELECT * FROM translations
    WHERE lang = (SELECT min(lang) FROM translations
        WHERE t3.id = t2.id))
    t2 ON t2.id = p.product_id;

Демо: http://www.sqlize.com/46Q73VJW24

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