如何在MySQL中加入第一个有序匹配?

问题描述 投票:1回答:3

我有2张这样的桌子

Cities:
id__| country__
--------------
_1__| 1000
_2__| 1001
_3__| 1002

Translates:
id__ | city_id  |      name       | __lang__ | _order_
-------------------------------------------------------
1____|     1    | Dnipro          | en       | 2
2____|     1    | Dnipropetrovsk  | en       | 1
3____|     1    | Ekaterinoslav   | en       | 3

如何加入仅按城市ID命令排序的翻译的第一个city_id?

我想要下一个结果:

id__| country__ | city_id  |      name       | __lang__ | _order_
1   | 1000      |    1     |  Dnipropetrovsk |   en     |    1

我正在尝试这样的代码

SELECT * FROM `cities` 
INNER JOIN `translates` ON `cities`.`id` = `translates`.`city_id` 
ORDER BY `order`
GROUP BY `city_id`

但是GROUP BY忽略ORDER BY并且在ORDER BY和没有ORDER BY的情况下始终保持相同的行

mysql join
3个回答
2
投票

有很多方法可以做到这一点,但这是一种方式!

SELECT cities.*, translates.* FROM cities INNER JOIN translates ON translates.city_id = cities.id INNER JOIN ( SELECT city_id, MIN(order) as order FROM translates GROUP BY city_id ) relevant_translates ON relevant_translates.city_id = translates.city_id AND relevant_translates.order = translates.order ;

relevant_translates子查询获取翻译表中每个city_id值的最小订单值。然后通过使用翻译进行内部联接,您只需将翻译值保留为最小订单值。祝好运!


0
投票

如果你的每个ordercity_id并不总是从1开始那么你可以使用相关的子查询来获得每个城市最小的order translate记录:

SELECT * 
FROM `cities` 
  INNER JOIN `translates` t1 ON `cities`.`id` = t1.`city_id` 
WHERE `order` = (SELECT min(`order`) FROM translates WHERE t1.city_id = translates.city_id);

如果它确实从1开始,那么只需要WHERE order=1并完成它。


0
投票

这是一种方法:

SELECT c.id, c. 
FROM cities c
INNER JOIN translates t ON cities.id = t.city_id 
WHERE t.order = (SELECT MIN(order)
                     FROM translates t1 
                     WHERE t1.city_id = c.id)
© www.soinside.com 2019 - 2024. All rights reserved.