0

我有一个包含产品的表和另一个包含这些产品名称的表(一个产品可以有多个不同语言的名称)。

我目前使用这样的查询来列出所有产品的名称:

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 不能做我想做的事情:-(

4

2 回答 2

1

您是否只想获取产品的英文名称?你的问题表明:

SELECT name
FROM name_table LEFT JOIN
     product_table ON name_table.product = product_table.product
where language = 'en'
ORDER BY name_table.product

或者,您是否尝试获取外国名称,但按其英文名称订购产品?如果是这样,您需要一个额外的连接:

SELECT name
FROM name_table LEFT JOIN
     product_table 
     ON name_table.product = product_table.product and
        name_table.language <> 'en' left outer join
     product_table pten
     on name_table.product = product_table.product and
        name_table.language = 'en'
ORDER BY pten.name, name_table.product_id

这假设一个产品只有一个英文名称。排序的第二个子句用于没有英文名称的情况,将所有其他名称放在一起。

于 2012-07-20T18:11:32.727 回答
0

您定义查询的方式似乎根本不需要加入产品表。

如果 name_table 具有产品列、语言列和您要获取的名称,为什么要连接到 product_table?请澄清一下,我想我可能知道你需要做什么,但这个问题的措辞让我感到困惑。

于 2012-07-20T18:16:19.537 回答