将右表上的多个记录过滤为左表的1个记录

时间:2016-10-19 07:38:11

标签: mysql join

所以我有一个翻译表,其中包含地名的各种表示。我在placeId上加入此表格,此表格作为右侧(左侧包含有关place的信息)。

但是,加入placeId会导致更多翻译,请参阅下表。 preferredName / shortName / historicName的内容全部为0或1.虽然每个翻译至少应有一条preferredName=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个记录。

2 个答案:

答案 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