好吧我试着谷歌搜索疯狂的答案,但我无法解决这个问题,所以我希望有人能够提供帮助。
假设我有一个用户表,非常简单的表:
id | userName
3 Michael
4 Mike
5 George
我还有另一张他们的汽车及其价格表。
id | belongsToUser | carPrice
1 4 5000
2 4 6000
3 4 8000
现在我需要做的是这样的事情(随意改写):
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
返回:
Mike | 5000
但我需要某个用户最贵的车,而不是第一个找到的车。
所以问题:如何设置要由carPrice,DESC订购的LEFT JOIN表?
答案 0 :(得分:45)
尝试将MAX
与GROUP BY
一起使用。
SELECT u.userName, MAX(c.carPrice)
FROM users u
LEFT JOIN cars c ON u.id = c.belongsToUser
WHERE u.id = 4;
GROUP BY u.userName;
GROUP BY
group by子句用于根据group by列的唯一组合将所选记录拆分为组。然后,这允许我们使用将依次应用于每组记录的聚合函数(例如,MAX,MIN,SUM,AVG,...)。数据库将为每个分组返回单个结果记录。
例如,如果我们有一组表示时间和地点温度的记录,如下所示:
Location Time Temperature
-------- ---- -----------
London 12:00 10.0
Bristol 12:00 12.0
Glasgow 12:00 5.0
London 13:00 14.0
Bristol 13:00 13.0
Glasgow 13:00 7.0
...
然后,如果我们想要按位置找到最高温度,那么我们需要将温度记录分成分组,其中特定组中的每个记录具有相同的位置。然后我们想要找出每组的最高温度。执行此操作的查询如下:
SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;
答案 1 :(得分:16)
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
答案 2 :(得分:11)
其他几个答案使用MAX提供解决方案。在某些情况下,使用agregate函数要么不可能,要么不具备性能。
我经常使用的替代方法是在连接中使用相关的子查询...
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.id = (
SELECT id FROM `cars` WHERE BelongsToUser = users.id ORDER BY carPrice DESC LIMIT 1
)
WHERE `id`='4'
答案 3 :(得分:7)
这将为您提供最昂贵的汽车:
SELECT users.userName, MAX(cars.carPrice)
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
然而,这句话让我觉得你想让所有的汽车价格分类,下降:
所以问题:如何设置要由carPrice,DESC订购的LEFT JOIN表?
所以你可以试试这个:
SELECT users.userName, cars.carPrice
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
ORDER BY users.userName ASC, cars.carPrice DESC
答案 4 :(得分:2)
试试这个:
SELECT
`userName`,
`carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'
ORDER BY `carPrice` DESC
LIMIT 1
菲利克斯