MYSQL:通过连接表格根据排名选择行

时间:2015-11-12 19:53:10

标签: mysql sql inner-join

我有三张桌子:

国家

Id  | code   |  name
-------------------------
1   | DE     |  Germany
2   | IT     |  Italy
3   | ES     |  Spain
4   | FR     |  France

货币

Id  | code     |   name          
-------------------------------
1   |  EUR     |   Euro            
2   |  USD     |   US Dollors      
3   |  CAD     |   Canadian Dollors 

country_currency

country_id    |  currency_id |  ranking
-------------------------------------------
1             |  1           |  5    
1             |  2           |  10      
1             |  3           |  15      
2             |  1           |  5      
3             |  1           |  10      
4             |  2           |  5      
4             |  3           |  10     

正如您在第三个表格中看到的那样,country_id => 1有三种不同排名的指定货币。换句话说,德国有三种指定货币(欧元,美元和加元)。因此,欧元应该与德国展示,因为它有5个排名,这是最小的。

对于意大利和西班牙,仅指定currency_id => 1(EUR)。因此,应该为意大利和西班牙展示欧元。

对于法国,currency_id => 2currency_id => 3(美元和加元),但美元在法国排名中的排名最低。所以,美元应该与法国一起展示。

预期结果

country         | currency
---------------------------
Germany         |  EUR                 
Italy           |  EUR                 
Spain           |  EUR                 
France          |  USD                 

我的查询

select country.name, currency.code from country_currency 
inner join country on country.id = currency_country.country_id 
inner join currency on currency.id = currency_country.currency_id
order by ranking asc
group by country_id

根本不起作用。任何人都可以帮我解决这个问题吗?

SQLFIDDLE

2 个答案:

答案 0 :(得分:4)

您可以使用以下查询:

SELECT name AS country, 
      (SELECT c3.code
       FROM country_currency AS c2 
       INNER JOIN currency AS c3 ON c3.id = c2.currency_id
       WHERE c1.id = c2.country_id 
       ORDER BY ranking LIMIT 1) AS currency
FROM country AS c1;

上述查询使用单个相关子查询,以获得具有每个国家/地区最低排名的货币的code值。

注意:如果多个货币对特定国家/地区共享相同的最低排名,则其中一个货币任意选择。

Demo here

答案 1 :(得分:2)

http://sqlfiddle.com/#!9/2a099/7

SELECT c.name, curr.name
FROM country c
LEFT JOIN country_currency cc
ON cc.country_id = c.id
LEFT JOIN country_currency cc_min
ON cc_min.country_id = cc.country_id
  AND cc.ranking > cc_min.ranking
LEFT JOIN currency curr
ON curr.id = cc.currency_id
WHERE cc_min.ranking IS NULL;