2010-11-19 2 views
3

Я пытаюсь вывести списки в одном запросе на основе выбранного языка. Но мне нужно сделать, если листинг недоступен для выбранного языка, тогда он вернет английский, если таковой существует.MySQL Условное место где

Так, если английский «ан» и японский «JP», следующий в данный момент возвращает японские списки:

SELECT * 
FROM listings LS 
LEFT JOIN listing_langs LANG ON LS.listing_id = LANG.listing_id 
WHERE LANG.language = 'jp' 

Я пытаюсь выяснить, что возможно даже в MySQL, чтобы создать запрос так что сначала он будет искать: LANG.language = 'jp' и вернуть японский список (как это делается сейчас), но если он окажется пустым, а затем найдите: LANG.language = 'en' и вместо этого верните это Английский листинг, если он существует.

Так что, в принципе, верните японский листинг, если он существует, но если он не по умолчанию не соответствует английскому листингу, если он существует.

+0

Возможно, вам понадобится создать производный запрос, используя оператор CASE для условия языка, объединив подзапросы 'jp' и' en' вместе, где 'jp' не сопоставляется. Мой первоначальный ответ не решил вашу проблему, поэтому я пометил ее для удаления. – 2010-11-19 16:38:46

+0

Большое спасибо. Я не уверен, как сделать производный запрос, но будет пытаться увидеть, что будет работать. – Frank

ответ

1

Вы всегда могли бы сделать что-то вроде этого:

SELECT * 
FROM listings LS 
LEFT JOIN listing_langs LANG ON (LS.listing_id = LANG.listing_id AND LANG.language = 'jp' OR 
    (NOT EXISTS (SELECT 1 FROM listing_langs WHERE listing_langs.listing_id = LS.listing_id AND listing_langs.language = 'jp') AND LANG.language = 'en') 

То есть явно проверить в JOIN, чтобы увидеть, если нет строки для jp и если нет, то используйте en.

Это большой уродливый, но он красноречиво фиксирует суть того, что вы пытаетесь сделать.

+0

Спасибо! Я просто попробовал быстрый тест, и это получилось прекрасно, показывая японский язык, если он был там, или заменил английский, если это не так. Я это очень ценю. – Frank

0
SELECT  * 
FROM   listings LS 
    LEFT JOIN listing_langs LANG 
    ON   LS.listing_id = LANG.listing_id 
WHERE   LANG.language = IFNULL(SELECT language FROM listing_langs WHERE language = 'jp','en') 

Без тестирования (или быть в состоянии проверить) я думаю, что IFNULL команда в MySQL должна быть большой для этого.

+0

Спасибо, я не мог заставить это работать, но я изучаю IFNULL больше ... – Frank

0

Почему бы вам не сделать

(SELECT *, 1 as grade 
FROM listings LS 
LEFT JOIN listing_langs LANG ON LS.listing_id = LANG.listing_id 
WHERE LANG.language = 'jp') 
UNION 
(SELECT *, 2 as grade 
FROM listings LS 
LEFT JOIN listing_langs LANG ON LS.listing_id = LANG.listing_id 
WHERE LANG.language = 'en') 
ORDER BY grade LIMIT 1 

Вы всегда будете иметь только одну строку, если jp если существует, в противном случае en, если она не существует.

Извините за предыдущую ошибку.

+0

Сначала должен быть только «jp» и второй «en», иначе вы можете сначала записать запись «en» –

+0

Когда я отправил для в первый раз, когда я совершил ошибку (у меня в запросе land = 'jp' OR lang = 'en' - я исправил это) – cristian

+0

Спасибо, простите, я не уточнил, что у меня будет несколько списков. Таким образом, это работает только с одним листингом, но если есть больше, он покажет как английский, так и японский, если они оба существуют (но в этом случае я хотел бы только вернуть японский). – Frank