我有一个非常大的 MySQL 语句通过 php foreach 循环,每个循环都使用 union all 连接到前一个循环。我将把陈述简化为我的问题的核心,如果需要,我当然也可以稍后根据要求添加更多细节。
我有这张桌子
+--------+-----------+-----------+
| ID | LANG | TITLE |
+--------+-----------+-----------+
| 1 | EN | T-A |
+--------+-----------+-----------+
| 1 | FR | T-A |
+--------+-----------+-----------+
| 2 | FR | T-B |
+--------+-----------+-----------+
| 3 | DE | T-C |
+--------+-----------+-----------+
| 3 | EN | T-C |
+--------+-----------+-----------+
我想在 SQL SELECT 中编写一个WHERE条件,该条件应向我显示每个 ID 最多一个结果。但仅当 LANG 为 FR 或 EN时,它才应显示结果。顶部应该首选 FR,并且仅当 ID 没有可用的 FR 时才应显示 EN 作为替代。所以结果看起来像这样。
+--------+-----------+-----------+
| ID | LANG | TITLE |
+--------+-----------+-----------+
| 1 | FR | T-A |
+--------+-----------+-----------+
| 2 | FR | T-B |
+--------+-----------+-----------+
| 3 | EN | T-C |
+--------+-----------+-----------+
我曾尝试使用 IF - ELSE / CASE 自己构建一些东西,但我对 SQL 不是很有经验,所以任何帮助都会非常感激。
我尝试过的简化 SQL 类似于
SELECT * FROM `table`
WHERE `table`.`ID` = 1
IF `table`.`LANG` = 'FR'
BEGIN
AND `table`.`LANG` = 'FR'
END
ELSE
BEGIN
AND `table`.`LANG` = 'EN'
END
union all
SELECT * FROM `table`
WHERE `table`.`ID` = 2
IF `table`.`LANG` = 'FR'
BEGIN
AND `table`.`LANG` = 'FR'
END
ELSE
BEGIN
AND `table`.`LANG` = 'EN'
END
union all
SELECT * FROM `table`
WHERE `table`.`ID` = 3
IF `table`.`LANG` = 'FR'
BEGIN
AND `table`.`LANG` = 'FR'
END
ELSE
BEGIN
AND `table`.`LANG` = 'EN'
END
Sitenote 我可能不会使用 ORDER BY 与 LIMIT 1 结合的任何构造,因为我通过 php 为每个循环多次循环 SQL。
编辑:对我有用的解决方案
SELECT * FROM `table1`
WHERE ID = 1
AND lang = 'FR'
OR (lang = 'EN' AND ID NOT IN (SELECT ID FROM table1 WHERE lang = 'FR'))