Mysql 对此的最佳查询是什么?

Mysql 对此的最佳查询是什么?,mysql,sql,database,select,exists,Mysql,Sql,Database,Select,Exists,我有公共汽车、街道、出发路线、返回路线的桌子 在桌子街我有 例如: id | name 1 | street1 2 | street2 3 | street4 ... n | streetn 我举了一个例子,表中的路径是: id_bus | id_street | order 101 | 1 | 1 101 | 2 | 2 101 | 5 | 3 ... 表route_return,我有一个示例: id_bus |

我有公共汽车、街道、出发路线、返回路线的桌子

在桌子街我有

例如:

id | name
1  | street1 
2  | street2
3  | street4
...
n  | streetn
我举了一个例子,表中的路径是:

id_bus | id_street | order
101    | 1         | 1
101    | 2         | 2
101    | 5         | 3

...
表route_return,我有一个示例:

id_bus | id_street | order
101    | 3         | 1
101    | 2         | 2
101    | 1         | 3

...
好的,在这个例子中,巴士101从街道1、2和5出发,顺序如下。从3号、2号和1号街回来的巴士,按这个顺序

我想知道哪些公共汽车经过“x”街和“y”街,先是x街,后是y街

例如:

x = 1, y = 5 -> the bus 101 pass
x = 1, y = 3 -> the bus 101 pass
x = 3, y = 1 -> the bus 101 pass
x = 3, y = 5 -> the bus 101 don't pass
所以,我的发现总线的sql是。。。例如,在1号和5号街道通行

select * from bus as b where 
-- The bus passes between the 2 streets at the going route??
exists (select * from route_going as rg1, route_going as rg2,street as r1,street as r2 where rg1.id_bus = rg2.id_bus and rg1.id_street = r1.id and rg2.id_street = r2.id and r1.id = 1 and r2.id = 5 and b.bus_id = rg1.id_bus and rg1.order <= rg2.order)
-- The bus passes between the 2 streets at the return route??
or exists (select * from route_return as rg1, route_return as rg2,street as r1,street as r2 where rg1.id_bus = rg2.id_bus and rg1.id_street = r1.id and rg2.id_street = r2.id and r1.id = 1 and r2.id = 5 and b.bus_id = rg1.id_bus and rg1.order <= rg2.order)
-- The bus passes between the 2 streets at the going route first and return route later??
or exists (select * from route_going as rg1, route_return as rg2,street as r1,street as r2 where rg1.id_bus = rg2.id_bus and rg1.id_street = r1.id and rg2.id_street = r2.id and r1.id = 1 and r2.id = 5 and b.bus_id = rg1.id_bus)
所以,我认为这个质疑是不好的。有人能帮我说说这个搜索的“最佳”查询是什么吗

select 
street.name,
route_going.id_bus,route_going.id_street
route_return.id_bus,route_return.id_street
on street.id=route_going.id_street and 
route_return.id_street=route_going.id_street;  

试试这个。谢谢

我们能喝一杯吗?请另外,添加有关索引的信息。这可能会有所不同。我不明白,你的代码做的事情太多了,不能只是检查一辆公共汽车是否通过了一条高速公路street@NoIdeaForName穿过两条街!按顺序@jpmc26我认为真正使问题复杂化的部分是订购要求。如果问题很简单,它会穿过这两条街道吗?这会简单得多。如果去和回不使用相同的数字进行订购,也会更简单。如中所示,如果返回值始终较高。我最初的想法是将两个路线表合并到一个表中,并添加一列以指示公共汽车是否正在行驶/返回,在该表中,使用能够完全排列路线中街道的数字。如果您想要不同的结果,请使用不同的运算符。我想知道UNION ALL是否会提高性能。因为这在联合中指定了0或1,所以没有任何行是相同的,因此如果引擎执行检查,则检查重复行是浪费周期。
SET @x = 1;
SET @y = 5;

SELECT x.id_bus
  FROM   
     ( SELECT *,0 returning FROM route_going UNION SELECT *, 1 FROM route_return ) x
  JOIN
     ( SELECT *,0 returning FROM route_going UNION SELECT *, 1 FROM route_return ) y
    ON y.id_bus = x.id_bus
   AND (y.returning > x.returning OR (y.returning = x.returning AND y.porder > x.porder))
 WHERE x.id_street = @x
   AND y.id_street = @y;