假设我在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
但这不起作用(子查询只允许返回一行)。
提前致谢。
答案 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;