2016-10-19 141 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