我有一张这样的表,我们会调用表foo
:
+----+------------+----------+----------+
| id | product_id | name | language |
+----+------------+----------+----------+
| 1 | 1 | Potatoes | English |
| 2 | 1 | Patatas | Spanish |
| 3 | 3 | Bananas | English |
+----+------------+----------+----------+
正如您所知,第1行和第2行是同一产品,第2行是第1行的翻译。
我想选择第2行和第3行。原因是通过选择第2行和第3行,我选择了我的表中的所有产品(没有重复)。我想选择第2行而不是第1行,因为我有一个"语言首选项"对于西班牙语 - 我想尽可能选择包含西班牙语翻译的行。如果没有西班牙语翻译(即产品3),我们只需选择英文版本(或product_id
等于id
列的版本)。
我如何在MySQL中解决这个问题?我现在有了这个,它选择了所有英文行,但我想对WHERE
部分应用一个条件,如上所述。
SELECT * FROM foo WHERE product_id = id
答案 0 :(得分:1)
这是一种方法:
select f.*
from foo f
where f.language = 'Spanish'
union all
select f.*
from foo f
where f.language = 'English' and
not exists (select 1 from foo f2 where f2.product_id = f.product_id and f2.language = 'Spanish');
这将选择所有英文foo行。然后是西班牙语中不匹配的行。
答案 1 :(得分:0)
另一种解决方案是:在表foo
中放置默认名称,即英文名称。
所有其他名称,例如西班牙语,在单独的表格中(例如foo_I18N
)