【发布时间】:2011-12-14 16:46:12
【问题描述】:
我有这个查询,但它需要的时间太长,通过 NaviCat 大约需要 30 秒。可以的话怎么优化?
SELECT DISTINCT c.clientid, c.name, c.email, c.region
FROM clients c RIGHT JOIN orders o ON c.clientid = o.clientid
WHERE o.order_status = 'pending'
AND c.clientid NOT IN (
SELECT DISTINCT c.clientid
FROM clients c, orders o
WHERE c.clientid = o.clientid AND o.order_status = 'paid'
)
ORDER BY c.id DESC
为了更好地了解我需要什么:我有 2 个表:
clients (id, clientid, name, email, region)
orders (id, orderid, clientid, order_amount, order_status, ….)
记录示例:
Client | Order | Status
-----------------------
C1 | O1 | (paid)
C1 | O2 | (pending)
C2 | O3 | (paid)
C3 | O4 | (pending)
C4 | O5 | (paid)
C5 | O6 | (pending)
我只需要返回C3 和C5
非常感谢您的回答。
【问题讨论】:
-
你为什么要检查两次
o.order_status =?每个订单都有一个状态吗? -
您确定要参加
RIGHT JOIN吗?看来您真的想要INNER JOIN。 (实际上,您似乎真的想要一个IN子句,但我可以想象性能原因迫使您改用JOIN。) -
@ajreal:每个订单都有一个状态,但一个客户可以有多个订单。 OP 希望找到确实有“待处理”订单并且没有有任何“已付款”订单的每个客户。
-
如果你想优化,你还应该提供表的定义和你有什么索引。
-
我不明白的是为什么你有两列似乎在两个表中都有相同的目的(主键)(
id和表client中的clientid)跨度>
标签: mysql optimization join