首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL:根据联接表的排序选择行

MYSQL:根据联接表的排序选择行
EN

Stack Overflow用户
提问于 2015-11-12 19:53:09
回答 2查看 238关注 0票数 2

我有三张桌子:

country

代码语言:javascript
复制
Id  | code   |  name
-------------------------
1   | DE     |  Germany
2   | IT     |  Italy
3   | ES     |  Spain
4   | FR     |  France

货币

代码语言:javascript
复制
Id  | code     |   name          
-------------------------------
1   |  EUR     |   Euro            
2   |  USD     |   US Dollors      
3   |  CAD     |   Canadian Dollors 

country_currency

代码语言:javascript
复制
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 (欧元)。因此,欧元应该展示给意大利和西班牙。

对于法国,currency_id => 2currency_id => 3 (美元和CAD),但美元有最低的排名与法国行。因此,美元应该显示与法国。

预期结果

代码语言:javascript
复制
country         | currency
---------------------------
Germany         |  EUR                 
Italy           |  EUR                 
Spain           |  EUR                 
France          |  USD                 

我的查询

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2015-11-12 20:19:42

您可以使用以下查询:

代码语言:javascript
复制
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值。

注:如果多种货币对某一特定国家具有相同的最低排名,则任意选择其中一种货币。

这里的演示

票数 4
EN

Stack Overflow用户

发布于 2015-11-12 20:52:14

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

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33680139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档