假设每个订单都有一个且只有一个取货地点,我会将您的架构更改为有一个 locations 表。
locations
id
name
address
province
...etc...
orders
id
pickup_id references locations
pickup_at
dropoff_id references locations
dropoff_at
...more info about the order...
您可能需要单独的接送表和下车表,每个表都引用位置,但重要的是要将位置标准化为单个表并引用它。
现在我们可以将订单与其位置关联起来。订单及其取货地点的基本查询是...
select ...
from orders o
join locations lp on lp.id = o.pickup_id
join locations ld on ld.id = o.dropoff_id
where ...
group by o.id;
我们可以使用它来查找在某个省份有取货或送货的订单。
select
o.id,
lp.name as pickup,
lp.province as pickup_province,
ld.name as dropoff,
ld.province as dropoff_province
from orders o
join locations lp on lp.id = o.pickup_id
join locations ld on ld.id = o.dropoff_id
where ? in (lp.province, ld.province)
group by o.id;
某个位置的订单。
select o.id, lp.name as pickup, ld.name as dropoff
from orders o
join locations lp on lp.id = o.pickup_id
join locations ld on ld.id = o.dropoff_id
where ? in (lp.name, ld.name)
group by o.id;
订单完全在一个省内。
select o.id, ld.province as province
from orders o
join locations lp on o.pickup_id = lp.id
join locations ld on o.dropoff_id = ld.id
where lp.province = ld.province
group by o.id
还有更多。
dbfiddle