定义要用于连接的行

时间:2012-07-20 17:53:40

标签: sql

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

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

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-gurus也使用了子选择(我的subselect-query非常慢,所以我想避免它),所以也许SQL不能做我想要的: - (

2 个答案:

答案 0 :(得分: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

这假定产品只有一个英文名称。排序的第二个条款是针对没有英文名称的情况,将所有其他名称保存在一起。

答案 1 :(得分:0)

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

如果name_table包含产品列,语言列和您尝试获取的名称,为什么还要加入product_table?请澄清一下,我想我可能知道你需要做什么,但这个问题以令人困惑的方式对我说。