我有三张桌子:
国家
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 => 2
和currency_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
根本不起作用。任何人都可以帮我解决这个问题吗?
答案 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
值。
注意:如果多个货币对特定国家/地区共享相同的最低排名,则其中一个货币任意选择。
答案 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;