如何限制SQL子查询或连接的结果

时间:2016-01-28 15:36:17

标签: mysql sql subquery left-join limit

假设我在MySQL中有两个表,一个叫做Vehicle,另一个叫做Passenger。

如果我想要所有车辆及其乘客的完整清单,那么我可以做这样的事情:

SELECT * 
  FROM Vehicle v 
  LEFT 
  JOIN Passenger p
    ON p.VehicleID = v.VehicleID 
 LIMIT 0,100

这里的问题是让我们想象我的车辆是公共汽车,第一辆有50名乘客,第二辆公共汽车有40辆,第三辆有30辆。上述查询的限制100将给我一份部分乘客列表。第3班车。

有没有办法创建一个不会从连接表中拆分结果的查询?

或者您可以将LIMITS分别应用于不同的表吗?所以我可以说我想要限制10辆车,每辆车限制50名乘客?

逻辑上是这样的:

SELECT * FROM Vehicle (LEFT JOIN Passenger ON Passenger.VehicleID = Vehicle.VehicleID LIMIT 0,50) LIMIT 0, 10

我想知道是否可以使用某种子查询来实现这一点?也许是这样的:

SELECT *, (SELECT * FROM Passenger WHERE Passenger.VehicleID = Vehicle.VehicleID LIMIT 0,50) FROM Vehicle LIMIT 0, 10

但这不起作用(子查询只允许返回一行)。

提前致谢。

1 个答案:

答案 0 :(得分:0)

在MySQL中,执行所需操作的最简单方法是使用变量枚举行:

SELECT * 
FROM (SELECT v.*, (@rnv := @rnv + 1) as seqnum_v
      FROM Vehicle v CROSS JOIN
           (SELECT @rnv := 0) params
     ) v LEFT JOIN
     (SELECT p.*,
             (@rnp := if(@v = VehicleId, @rnp + 1,
                         if(@v := VehicleId, 1, 1)
                        )
             ) as seqnum_p
      FROM Passenger p CROSS JOIN
           (SELECT @v := -1, @rnp := 0) params
     ) p
     ON p.VehicleID = v.VehicleID 
WHERE seqnum_v <= 10 and seqnum_p <= 50;