Mysql 如何限制SQL子查询或联接的结果
假设我在MySQL中有两个表,一个叫做Vehicle,另一个叫做Passenger 如果我想要所有车辆及其乘客的完整列表,我可以这样做:Mysql 如何限制SQL子查询或联接的结果,mysql,sql,subquery,left-join,limit,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 SELECT * FROM Vehicle (LEFT JOIN Passenger ON Passenger.VehicleID = Vehicle.Ve
SELECT *
FROM Vehicle v
LEFT
JOIN Passenger p
ON p.VehicleID = v.VehicleID
LIMIT 0,100
SELECT * FROM Vehicle (LEFT JOIN Passenger ON Passenger.VehicleID = Vehicle.VehicleID LIMIT 0,50) LIMIT 0, 10
这里的问题是让我们假设我的车辆是公交车,第一辆车有50名乘客,第二辆车有40名乘客,第三辆车有30名乘客。上述查询中的限制为100,这将为我提供第三辆公交车上的部分乘客名单
有没有一种方法可以创建这样一个查询,而不会将结果从联接表中分割出来
或者,您可以对不同的表分别应用限制?所以我可以说我想要10辆车的限制和每辆车50名乘客的限制
逻辑上是这样的:
SELECT *
FROM Vehicle v
LEFT
JOIN Passenger p
ON p.VehicleID = v.VehicleID
LIMIT 0,100
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
但是这不起作用,子查询只允许返回一行
提前感谢。在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;
在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;
加入子查询加入子查询