【问题标题】:MYSQL: Select row based on ranking by joining tablesMYSQL:通过连接表根据排名选择行
【发布时间】:2015-11-12 19:53:09
【问题描述】:

我有三个给定的表:

国家

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_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 分配了三种不同排名的货币。换句话说,德国有三种指定货币(欧元、美元和加元)。因此,EUR 应该与德国一起显示,因为它有 5 个最低排名。


对于意大利和西班牙,仅分配了currency_id => 1 (EUR)。因此,应该为意大利和西班牙显示 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

【问题讨论】:

  • 请分享您正在处理的 SQL 查询,有人会帮助修复它。
  • 好的,我现在就去做。
  • 两个货币可以与一个国家的最小值相同吗?像法国一样都有 5 个?
  • 没有。在我的桌子上,它总是不同的。假设它们彼此不同。但具有相同的最小值。我们可以选择任何一个。
  • 在 OP 的问题中添加了 SQLFIDDLE:sqlfiddle.com/#!9/1eb2c7

标签: mysql sql inner-join


【解决方案1】:

您可以使用以下查询:

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

【讨论】:

  • 这不是令人敬畏的别名,但让我赞成你的答案;-)
  • 感谢您的回答。我了解相同的最低排名,但它不会发生在我的表中。
【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多