Похоже, вам нужно французское описание, если оно существует, в противном случае откройте его на английском.
SELECT item.id,
COALESCE(
(
SELECT lang.data
FROM language l
WHERE l.item = i.id
AND l.language = 'fr'
),
(
SELECT lang.data
FROM language l
WHERE l.item = i.id
AND l.language = 'en'
)
) AS description
FROM item i
, или это:
SELECT item.id,
COALESCE(lfr.data, len.data)
FROM item i
LEFT JOIN
language lfr
ON lfr.item = i.id
AND lfr.language = 'fr'
LEFT JOIN
language len
ON len.item = i.id
AND len.language = 'en'
Первый запрос более эффективен, если велика вероятность нахождения описания на французском языке (он не оценивает второй подзапрос, если первый подан успешно).
В SQL Server
, Oracle
и PostgreSQL
этот, вероятно, будет более эффективным, если у вас много французских описаний:
SELECT item.id,
COALESCE(
lfr.data,
(
SELECT lang.data
FROM language l
WHERE l.item = i.id
AND l.language = 'en'
)
) AS description
FROM item i
LEFT JOIN
language lfr
ON lfr.item = i.id
AND lfr.language = 'fr'
В этом запросе будет использован эффективный метод (HASH JOIN
или MERGE JOIN
), чтобы объединить описания на французском языке, и откроется английский только в случае необходимости.
Для MySQL
запросы 1st
и 3rd
не имеют значения.
Во всех системах создайте составной индекс для language (item, language)