如何限制 SQL 子查询或连接的结果
How to limit results from a SQL subquery or join
假设我在 MySQL 中有 2 个 table,一个叫 Vehicle,另一个叫 Passenger。
如果我想要所有车辆及其乘客的完整列表,那么我可以这样做:
SELECT *
FROM Vehicle v
LEFT
JOIN Passenger p
ON p.VehicleID = v.VehicleID
LIMIT 0,100
这里的问题是假设我的车辆是公共汽车,第一辆有 50 名乘客,第二辆有 40 名,第三辆有 30 名。上述查询中的 Limit 100 会给我部分乘客列表3路公交车。
有没有一种方法可以创建这样一个查询,它不会将结果从联接的 table 中拆分出来?
或者您能否将 LIMITS 分别应用于不同的 table?所以我可以说我想要限制 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
但这不起作用(子查询只允许 return 单行)。
提前致谢。
在 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 中有 2 个 table,一个叫 Vehicle,另一个叫 Passenger。
如果我想要所有车辆及其乘客的完整列表,那么我可以这样做:
SELECT *
FROM Vehicle v
LEFT
JOIN Passenger p
ON p.VehicleID = v.VehicleID
LIMIT 0,100
这里的问题是假设我的车辆是公共汽车,第一辆有 50 名乘客,第二辆有 40 名,第三辆有 30 名。上述查询中的 Limit 100 会给我部分乘客列表3路公交车。
有没有一种方法可以创建这样一个查询,它不会将结果从联接的 table 中拆分出来?
或者您能否将 LIMITS 分别应用于不同的 table?所以我可以说我想要限制 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
但这不起作用(子查询只允许 return 单行)。
提前致谢。
在 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;