我有五张桌子
orders(order_id,user_id,)
order_info(id,price,tax,discount)
users(user_id,uadd_id)
user_address(uadd_id,type,city_id)
city_info(city_id,city_name,city_code)
我需要获取包含来自order_info
表的订单信息的订单报告,user_information通常来自用户表,用户发货和帐单地址均来自user_address
表。 users.uadd_id
user_address.id
地图包含user_address.type
和city_info
商店(如果是送货地址或帐单邮寄地址)。因此,对于相同的订单,我需要两行user_address用于发货,另一行用于结算。 select o.*,oi.*,billing_info.name as binfo_name,shipping_info.name_name
from order o
left join order_info oi on o.order_id = oi.id
left join (
select * from user u1
left join user_address ua1 on ua1.uadd_id = u1.uadd_id
left join city_info ci1 on ua1.city_id = ci1.city_id where ua1.type = 'billing') as billing_info
on billing_info.user_id = o.user_id
left join (select * from user u2
left join user_address ua2 on ua2.uadd_id = u2.uadd_id
left join city_info ci2 on ua2.city_id = ci2.city_id
where ua1.type = 'shipping' ) as shipping_info
on shipping_info.user_id = o.user_id
where 1;
表包含city的详细信息,应与用户地址表连接以获取用户地址的完整信息。
我试过了这个查询
create temporary table shipping_info
select * from user u1
left join user_address ua1 on ua1.uadd_id = u1.uadd_id
left join city_info ci1 on ua1.city_id = ci1.city_id
where ua1.type = 'billing';
create temporary table billing_info
select * from user u1
left join user_address ua1 on ua1.uadd_id = u1.uadd_id
left join city_info ci1 on ua1.city_id = ci1.city_id
where ua1.type = 'shipping';
select o.*,oi.*,billing_info.name as binfo_name,shipping_info.name_name
from order o
left join order_info oi on o.order_id = oi.id
left join shipping_info on shipping_info.user_id = o.user_id
left join billing_info on billing_info.user_id = o.user_id
where 1;
(我为billing_info和shipping_info选择了其他列)这样可以获得结算和发货信息,但问题是查询需要花费大量时间(差不多2秒)才能执行。我在所有表中都有大量数据。所以我需要做别的事。
我尝试使用临时表来存储所有必需的运费和结算信息,并使用这两个表加入订单表,但它仍然需要花费大量时间(再次为2秒) 这是我尝试使用临时表的方式:
{{1}}
任何人都可以帮助我如何使用上述任何方式或其他方式有效地做到这一点?
如果由于语法而导致查询中出现任何错误,请忽略现在因为我必须更改实际查询以尽可能缩短红色数据并使用此临时表与其他表连接以选择所需数据。