如何在SQL查询中排序LEFT JOIN的顺序?

Ric*_*uez 42 mysql sql greatest-n-per-group

好吧我试着谷歌搜索疯狂的答案,但我无法解决这个问题,所以我希望有人能够提供帮助.

假设我有一个用户表,非常简单的表:

id | userName
3    Michael
4    Mike
5    George
Run Code Online (Sandbox Code Playgroud)

我还有另一张他们的汽车和价格表.

id | belongsToUser | carPrice
1    4               5000
2    4               6000
3    4               8000
Run Code Online (Sandbox Code Playgroud)

现在我需要做的是这样的事情(随意重写):

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
Run Code Online (Sandbox Code Playgroud)

哪个回报:

Mike | 5000
Run Code Online (Sandbox Code Playgroud)

但我需要某个用户最贵的车,而不是第一个找到的车.

所以问题:如何设置要由carPrice,DESC订购的LEFT JOIN表?

a'r*_*a'r 49

尝试使用MAXGROUP 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;
Run Code Online (Sandbox Code Playgroud)

更多信息 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
...
Run Code Online (Sandbox Code Playgroud)

然后,如果我们想要按位置找到最高温度,那么我们需要将温度记录分成分组,其中特定组中的每个记录具有相同的位置.然后我们想要找出每组的最高温度.执行此操作的查询如下:

SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;
Run Code Online (Sandbox Code Playgroud)


ven*_*dor 16

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
Run Code Online (Sandbox Code Playgroud)

  • 除非你没有其他选择,否则总是尽量避免像这样的子选择.这可能适用于小型数据集,但开始使用数千或数百万行,最终会遇到性能问题. (5认同)

Mat*_*lie 12

其他几个答案使用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'
Run Code Online (Sandbox Code Playgroud)

  • 如果`cars`表包含其他信息,例如品牌,型号,车牌等.此方法查找单个记录及其所有字段.MAX()方法只查找一个字段的值.这取决于问题的真实意图(最高价格)vs(最高价格的汽车) (3认同)

For*_*lon 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
Run Code Online (Sandbox Code Playgroud)

但是,这句话让我觉得你想要所有的汽车价格分类,降序:

所以问题:如何设置要由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
Run Code Online (Sandbox Code Playgroud)