2016-10-19 136 views
1

因此,我有一个翻译表,其中包含地名的各种表示形式。我加入此表的placeId,这张表作为右侧(左侧包含有关place的信息)。将右表的多条记录过滤为左表的1条记录

但是,加入placeId会导致更多翻译,请参阅下表。 preferredName/shortName/historicName的内容全部为0或1.没有规则,但每个翻译应该至少有1条记录,其中包含preferredName=1

所以我最终得到的是:我怎么可以只选择这些翻译1,具体为:

  • 如果纪录preferredName=1存在:使用此
  • 否则,如果纪录shortName=1存在:使用这
  • 否则,如果既不是真实的(所以无论是0),然后选择该记录

+---------------+---------+------------------+---------------+-----------+--------------+ 
| translationId | placeId | alternateName | preferredName | shortName | historicName | 
+---------------+---------+------------------+---------------+-----------+--------------+ 
|   4832 |  554 | 'New York'  |    1 |   0 |   0 | 
|   4833 |  554 | 'NY'    |    0 |   1 |   0 | 
|   4834 |  554 | 'New York City' |    0 |   0 |   0 | 
+---------------+---------+------------------+---------------+-----------+--------------+ 

任何线索?基本上归结为将右表上的多个匹配过滤到左表的1条记录。

+0

排序“preferredName”和“ ShortName“,然后选择第一个结果;) –

+0

当你将10个位置匹配到这些翻译时,你将如何做到这一点;我想在这种情况下返回10条记录(每条记录都有相应的翻译作为字段) – Flame

+0

您可以在子请求中选择'select ... from ... order by ...',也许'limit 1 ' –

回答

0

您可以加入不同的条件,3次和聚结的结果:

select 
a.*, 
coalesce(name1.alternateName, name2.alternateName, name3.alternateName) as alternateName 
from _table1_ as a 
left join _table2_ as name1 on (a.placeId = name1.placeId and name1.preferredName=1) 
left join _table2_ as name2 on (a.placeId = name2.placeId and name2.shortName=1) 
left join _table2_ as name3 on (a.placeId = name3.placeId and name3.preferredName=0 and name3.shortName=0) 
group by a.placeId 
+0

我会稍后尝试一下;只有一件事:对于preferredName/shortName,对1-1,1-0,0-1和0-0都可以存在(对可以存在双倍,但我们可以选择其中之一)。 所以它应该在0-1之前的1-0,1-0之前返回1-1,而0-0之前的0-1-0-0 – Flame

0

按照我以前的评论,你可以让你加入关于子请求请求。

试试这个:

SELECT * FROM mytable WHERE placeId = 554 ORDER BY preferredName DESC, shortName DESC; 

它会为了准确的结果,只要你想,你preferrence。 Juste添加限制1蚂蚁你是对的!

SELECT * FROM mytable WHERE placeId = 554 ORDER BY preferredName DESC, shortName DESC LIMIT 1; 

,只需添加你第一部分的要求,使您的加入对这个;)

编辑:下面是相对于评论

LEFT OUTER JOIN 
    (SELECT * FROM alternatename 
    WHERE isoLanguage="NL" AND geonameid = a1.geonameid 
    ORDER BY isPreferredName DESC, isShortName DESC 
    LIMIT 1 
    ) 
    AS alternate10 
ON 
    alternate10.geonameid = a1.geonameid 
+0

嗯是的,这似乎解决了这个问题;然而:即时通讯使用了一个非常大的数据集,并且我刚建立了这个子查询到我的主要查询中,并且它增加了13秒的执行时间。 – Flame

+0

如果您希望我们尝试优化您的请求,您能向我们展示您的主要要求吗?这个请求非常快,所以我认为我们需要在你的主体上工作,并且可能会发现你的索引在你的情况下可能是有用的。 –

+0

http:// pastebin。com/tqG0N5ds 这是一般的想法。注意:全文搜索(MATCH/AGAINST)不是罪魁祸首。在不进行子查询时,查询执行时间在50ms左右 – Flame