được, vì vậy truy vấn sau có thể được thực hiện mà không cần truy vấn con mà thay vào đó là một phép nối. Tôi tin tưởng trình tối ưu hóa truy vấn làm được điều này, nhưng tôi không chắc lắm.
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
Trong phiên bản này, language_id 1 được sử dụng làm dự phòng ưu tiên, bạn có thể thêm nhiều ngôn ngữ khác theo cách tương tự. Sử dụng FIND_IN_SET
thay vào đó, tiêu chí thứ tự thứ hai cũng sẽ hoạt động (FIND_IN_SET(cl.language_id,'1,2,3') DESC
hoặc bất kỳ thứ tự nào bạn muốn).
Tất nhiên truy vấn này ngay bây giờ là cho một country_id cố định. Nó có thể được mở rộng theo cách tương tự cho nhiều quốc gia có liên kết khác:
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
một giải pháp thay thế cho các truy vấn con sẽ là tham gia country_languages hai lần và chỉ cần chọn một truy vấn đầu tiên không rỗng (có thể là một trong những giải pháp rõ ràng hơn):
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)
Nếu id ngôn ngữ 1 là ngôn ngữ dự phòng của bạn. Điều này cũng có thể được mở rộng để cung cấp nhiều ngôn ngữ dự phòng ...