MYSQL 在左连接中添加 OR 子句会减慢查询速度
MYSQL adding OR clause in left join slowing up the query
我有两个数据库 table:orders 和 customers。
我 运行 SQL 需要在 6 月收到所有订单。
如果 Ship To 和 Bill To 电子邮件不同,我们将插入两个不同的记录,其中两个电子邮件都发送到 客户 table.
select o.order_id
, o.total
, c.customer_email
from orders o
left
join customers c
ON o.bill_email = c.customer_email
OR o.ship_email = c.customer_email
where DATE(o.order_date) >= '2020-06-01'
但是这个 SQL 由于条件
加载时间太长
ON o.bill_email=c.customer_email
OR o.ship_email=c.customer_email
如何在 ON 子句中添加这两个条件?
如有任何帮助,我们将不胜感激。
使用两个 left join
并将结果放在单独的列而不是行中:
select o.order_id, o.total, cb.customer_email, so.customer_email
from orders o left join
customers cb
on o.bill_email = cb.customer_email left join
customers cs
o.ship_email = cs.customer_email
where o.order_date >= '2020-06-01';
请注意,不需要 date()
函数。
也就是说,这似乎更容易表达为:
select o.order_id, o.total, o.bill_email
from orders o
where o.order_date >= '2020-06-01'
union all
select o.order_id, o.total, o.ship_email
from orders o
where o.order_date >= '2020-06-01' and s.ship_email <> o.bill_email;
我有两个数据库 table:orders 和 customers。
我 运行 SQL 需要在 6 月收到所有订单。
如果 Ship To 和 Bill To 电子邮件不同,我们将插入两个不同的记录,其中两个电子邮件都发送到 客户 table.
select o.order_id
, o.total
, c.customer_email
from orders o
left
join customers c
ON o.bill_email = c.customer_email
OR o.ship_email = c.customer_email
where DATE(o.order_date) >= '2020-06-01'
但是这个 SQL 由于条件
加载时间太长ON o.bill_email=c.customer_email
OR o.ship_email=c.customer_email
如何在 ON 子句中添加这两个条件?
如有任何帮助,我们将不胜感激。
使用两个 left join
并将结果放在单独的列而不是行中:
select o.order_id, o.total, cb.customer_email, so.customer_email
from orders o left join
customers cb
on o.bill_email = cb.customer_email left join
customers cs
o.ship_email = cs.customer_email
where o.order_date >= '2020-06-01';
请注意,不需要 date()
函数。
也就是说,这似乎更容易表达为:
select o.order_id, o.total, o.bill_email
from orders o
where o.order_date >= '2020-06-01'
union all
select o.order_id, o.total, o.ship_email
from orders o
where o.order_date >= '2020-06-01' and s.ship_email <> o.bill_email;