我有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的情况下始终保持相同的行
有很多方法可以做到这一点,但这是一种方式!
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值的最小订单值。然后通过使用翻译进行内部联接,您只需将翻译值保留为最小订单值。祝好运!
如果你的每个order
的city_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
并完成它。
这是一种方法:
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)