oke, jadi kueri berikut mungkin bisa dilakukan tanpa subkueri tetapi dengan bergabung. Saya percaya pengoptimal kueri melakukan ini, tetapi saya tidak terlalu yakin.
SELECT l.name as language,
(SELECT cl.name
FROM country_languages cl
WHERE cl.country_id=[the wanted country id]
ORDER BY cl.language_id=l.id DESC,
cl.language_id=1 DESC
LIMIT 1) as country_name
FROM languages l
Dalam versi ini language_id 1 digunakan sebagai pilihan mundur, Anda mungkin dapat menambahkan lebih banyak bahasa dengan cara yang sama. Menggunakan FIND_IN_SET
sebagai gantinya kriteria urutan kedua juga akan berfungsi (FIND_IN_SET(cl.language_id,'1,2,3') DESC
atau pesanan apa pun yang Anda inginkan).
Tentu saja kueri ini sekarang adalah untuk country_id tetap. Itu bisa diperpanjang dengan cara yang sama untuk beberapa negara dengan bergabung lain:
SELECT l.name as language,
(SELECT cl.name
FROM country_languages cl
WHERE cl.country_id=c.id
ORDER BY cl.language_id=l.id DESC,
cl.language_id=1 DESC
LIMIT 1) as country_name
FROM countries c
JOIN languages l
alternatif untuk subkueri adalah bergabung dengan country_languages dua kali, dan cukup pilih yang pertama bukan null (yang mungkin merupakan salah satu solusi yang lebih bersih):
SELECT l.name as language,
COALESCE(first.name, second.name) as country_name
FROM countries c
JOIN languages l
LEFT JOIN country_languages first ON
(first.country_id=c.id AND first.language_id=l.id)
LEFT JOIN country_languages second ON
(second.country_id=c.id AND second.language_id=1)
Jika bahasa id 1 adalah bahasa cadangan Anda. Ini dapat diperluas juga untuk menyediakan beberapa bahasa cadangan ...