Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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子查询多个条件_Mysql_Sql - Fatal编程技术网

mysql子查询多个条件

mysql子查询多个条件,mysql,sql,Mysql,Sql,我有一个表bus_stops,包含公交站点的路线id,如下所示: sl_no route_id stop_name ------------------------------------------------------------- 1 1234 stop1 2 1234 stop2 3 1

我有一个表bus_stops,包含公交站点的路线id,如下所示:

 sl_no     route_id                    stop_name
-------------------------------------------------------------
  1          1234                       stop1
  2          1234                       stop2
  3          1235                       stop7
  4          1235                       stop8
  5          5678                       stop1
  6          5678                       stop2
我想要一个路线id,其中包含从车站到车站的车站1的车站1和车站2的车站1和车站2。我想获得1234,但不包括从车站到车站的车站2和车站1的车站1

我写了这个查询:

SELECT DISTINCT route_id FROM bus_stops AS myAlias
WHERE EXISTS ( SELECT * FROM bus_stops WHERE route_id = myAlias.route_id AND stops = 'stop1' )
  AND EXISTS ( SELECT * FROM bus_stops WHERE route_id = myAlias.route_id AND stops = 'stop2' )

但它会将路线id返回到stop1,即从车站返回到车站,stop2返回到车站,stop2返回到车站,stop1返回到车站

如果我正确理解了您的要求,您可以尝试以下方法:

SELECT
    route_id
FROM 
    bus_stops
WHERE
    stop_name IN ('stop1','stop2')
GROUP BY
    route_id
HAVING 
    COUNT(*) = 2
更新:要按您想要的顺序从和到:

SELECT
    tmp.route_id,
    GROUP_CONCAT(IF(tmp.smin = bs.sl_no AND bs.stop_name = 'stop1','from stop1','') SEPARATOR '') as bfrom,
    GROUP_CONCAT(IF(tmp.smax = bs.sl_no AND bs.stop_name = 'stop2','to stop2','') SEPARATOR '') as bto
FROM (
    SELECT
        route_id,
        MIN(sl_no) as smin,
        MAX(sl_no) as smax
    FROM 
        bus_stops
    WHERE
        stop_name IN ('stop1','stop2')
    GROUP BY
        route_id
    HAVING 
        COUNT(*) = 2
) as tmp
INNER JOIN bus_stops bs
    ON bs.route_id = tmp.route_id
GROUP BY
    tmp.route_id
HAVING
    bfrom <> ''
    AND bto <> ''

使用连接来获取路线,其中to stop位于from stop之后,即to stop的sl_编号大于from stop:-

SELECT a.route_id, a.stop_name, b.stop_name
FROM bus_stops a
INNER JOIN bus_stops b 
ON a.route_id = b.route_id
AND a.stop_name = 'stop1'
AND b.stop_name = 'stop2'
AND a.sl_no < b.sl_no

提供的表结构没有提到“从”和“到”车站,但您声称您现有查询的问题是,它返回stop1的路线id作为“从车站”,stop2作为“到车站”,stop2作为“从车站”,stop1作为“到车站”。你如何区分从站和到站?@Mark我想他使用sl_no,所以站的顺序是:1,2,3。。。至少我认为这是我用sl_no订购的东西。。。