SQL语句过滤

时间:2013-11-05 05:39:41

标签: sql

我想创建一个查询,它将返回包含两个停止变量的所有route_id。

|   route_stop_id   |   route_id    |   stop_id |   time (in sec)   |
———————————————————————————————————————————————————————————————————————
|   1           |   1           |   1       |   3:24pm      |
|   2           |   1           |   2       |   3:26pm      |
|   3           |   1           |   3       |   3:29pm      |
|   4           |   1           |   4       |   4:04pm      |
|   5           |   2           |   1       |   3:03pm      |
|   6           |   3           |   1       |   3:02pm      |

如果route_idstop_id = 1stop_id = 2

SELECT route_id FROM route_stop_list WHERE stop_id = 1 and stop_id = 2

但是上面的语句没有返回任何内容,因为没有行可以同时拥有stop_id 1stop_id 2。但是有可能写出一个能够正确返回的声明吗?


编辑,更多解释因为我认为这有点令人困惑。

这是一个交通工具。

我的应用程序要求用户输入起止点和结束点。

我正在尝试编写一个SQL语句,它将返回两个停靠点都存在的所有路由。

3 个答案:

答案 0 :(得分:2)

使用这个(已编辑)

SELECT t1.route_id 
FROM route_stop_list t1 join route_stop_list t2 on t1.route_id=t2.route_id
where  t1.stop_id=1 AND t2.stop_id=2

解释

我首先加入了2张桌子(你自己的桌子)。 t1和t2只是表的别名(昵称),以便您以后可以参考它们。这给了我们所有可能的组合。加入条件具有相同的路径ID。尝试运行没有最后一行(where子句)的查询。使用select *获取所有列。如果你仍然不明白,我会解释更多。

答案 1 :(得分:1)

请尝试:

SELECT route_id 
FROM route_stop_list 
WHERE stop_id IN (1, 2)
GROUP BY route_id
HAVING COUNT(DISTINCT stop_id)=2

答案 2 :(得分:0)

这样做:

SELECT route_id FROM route_stop_list
WHERE stop_id IN (1, 2)
GROUP BY route_id
HAVING COUNT(DISTINCT stop_id) = 2

小提琴here

唯一需要考虑的是,您需要将IN子句中的元素数量与HAVING子句中的数字相匹配。

请注意,您无需加入NN是要查找的路由数量。这是非常低效的。

最后,请注意,如果给定的HAVING不能有2个或更多相同的stop_id,则应将route_id子句替换为以下HAVING COUNT(*) = 2

{{1}}