所以我有一个翻译表,其中包含地名的各种表示。我在placeId
上加入此表格,此表格作为右侧(左侧包含有关place
的信息)。
但是,加入placeId会导致更多翻译,请参阅下表。 preferredName / shortName / historicName的内容全部为0或1.虽然每个翻译至少应有一条preferredName=1
的记录,但没有规则。
所以我最终得到的结论是:我如何才能选择其中一种翻译,特别是:
preferredName=1
存在记录:请使用此shortName=1
一起存在,则使用此处:
+---------------+---------+------------------+---------------+-----------+--------------+
| 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 :(得分:0)
您可以在不同条件下加入3次并对结果进行COALESCE:
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
答案 1 :(得分:0)
根据我之前的评论,您可以在子请求上发出JOIN请求。
试试这个:
SELECT * FROM mytable WHERE placeId = 554 ORDER BY preferredName DESC, shortName DESC;
它会根据您的喜好完全按照您的要求订购结果。 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