我有一个包含产品的表和另一个包含这些产品名称的表(一个产品可以有多个不同语言的名称)。
我目前使用这样的查询来列出所有产品的名称:
SELECT name
FROM name_table
LEFT JOIN product_table ON name_table.product = product_table.product
ORDER BY name_table.product, language != 'en', language != '*'
这将产生所有名称的列表,并且最好的可用名称(如果有,则为国际名称,如果不存在任何名称,则为国际名称)总是首先出现。我只是跳过每个产品的第一个条目之后的所有条目 - 不优雅,但它运行得足够快。
问题是我无法按字母顺序排序。
但是,当我使用这样的东西时:
SELECT
product,
(SELECT name
FROM name_table
WHERE name_table.product = product_table.product
ORDER BY language != 'en'
LIMIT 1) AS bestname
FROM product_table
ORDER BY bestname
那么查询非常慢(至少对于 MySQL)。
此查询速度很快,但似乎未定义(因此是准随机的)使用的名称行:
SELECT name
FROM product_table
LEFT JOIN name_table ON name_table.product = product_table.product
ORDER BY name
如果我只能告诉 MySQL 使用哪一行来连接,那么一切都会好起来的。
如果存在多个匹配的行,有没有办法定义在连接中使用哪一行?
编辑:产品可以有任何语言的名称,并非所有产品都有英文名称,抱歉造成混淆。
Edit2:我发现了一个等效的问题:MySQL JOIN the most recent row only? 在那里,SQL 专家还使用了子选择(我的子选择查询非常慢,所以我想避免它),所以也许 SQL 不能做我想做的事情:-(