Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何限制SQL子查询或联接的结果_Mysql_Sql_Subquery_Left Join_Limit - Fatal编程技术网

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

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

假设我在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.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;

加入子查询加入子查询