Im Folgenden wird wählen in der bevorzugten Sprache des name
:
Product:
ProductId ProductName
Language:
LanguageId LanguageName
Product_Lanugage:
ProductId Languageid
Die Abfrage so sein würde. Wenn der Name nicht in der bevorzugten Sprache verfügbar ist, wählt er die Sprache mit dem höchsten Wert lang_no
.
SELECT product_id,
langNum,
name
FROM (SELECT products.product_id AS product_id,
CASE
WHEN hasPreferredLang = 0 THEN
maxLangNum
ELSE
preferredLang
END AS langNum
FROM (SELECT product_id AS product_id,
MAX(lang_no) AS maxLangNum
FROM products
GROUP BY product_id
) AS maxLangNumFinder
JOIN (SELECT product_id AS product_id,
SUM(CASE
WHEN lang_no = preferredLang THEN
1
ELSE
0
END) AS hasPreferredLang
FROM products
GROUP BY product_id
) AS hasPreferredLangFinder ON hasPreferredLang.product_id = maxLangNumFinder.product_id
) AS preferredLangNumFinder
JOIN products ON preferredLangNumFinder.langNum = products.lang_no
preferredLangNumFinder.product_id = products.product_id;
Die Anweisung beginnt mit der Bestimmung, was der maximal verfügbare Wert von lang_no
für jeden Wert von product_id
ist. Dies ist so, dass wir einen Wert von lang_no
bestimmen können, um zu verwenden, wo der product_id
keinen Eintrag für die bevorzugte Sprache hat.
Diese Unterabfrage ist dann INNER JOIN
ed auf eine andere, die jeden product_id
zusammen mit einem Wert von 0
auflistet, um anzuzeigen, wenn der product_id
nicht die bevorzugte Sprache mit ihm verbunden hat oder 1
wo es der Fall ist.
Die Ergebnisse der Unterabfrage werden dann verwendet, um zu testen, ob jede product_id
die bevorzugte Sprache hat. Wenn dies der Fall ist, wird die bevorzugte Sprache zurückgegeben. Wenn dies nicht der Fall ist, wird der größte verfügbare Wert von lang_no
verwendet.
Die sich ergebende Liste von product_id
Werte und ihre gewählten lang_no
Werte ist dann INNER JOIN
ED products
auf die gemeinsamen Werte der product_id
und lang_no
, mit dem product_id
, ausgewählt lang_no
und name
für die gewählte Sprache SELECT
ED aus dem resultierenden Datensatzes sein.
Wenn Sie irgendwelche Fragen oder Kommentare haben, dann zögern Sie nicht, einen Kommentar entsprechend zu posten.
Wenn ein 'Produkt' viele Sprachen haben kann und Sie möchten, dass wir eine * andere * Sprache verwenden, von welcher Sprache sollte dann die gewählte Sprache abweichen? – toonice
@toonice: Wenn ich eine Liste mit spanischen Namen mache, ist es besser, den englischen oder irgendeinen anderen Namen in der Liste zu verwenden, als das Produkt komplett auszulassen. Im Moment habe ich keine Vorliebe für die Fallback-Sprache. Alles ist in Ordnung. –