2016-07-22 46 views
0

我有以下查询MySQL查询冻结

SELECT DISTINCT 
    Products.Product_name 
    FROM Order_details 
    INNER JOIN Products 
    ON Products.Product_codenumber = Order_details.Product_codenumber 
    INNER JOIN Orders 
    ON Order_details.Order_ID = Orders.Order_ID 
    INNER JOIN Customers 
    ON Orders.Customer_ID = Customers.Customer_ID 
    INNER JOIN Discount_cards 
    ON Discount_cards.Phone_number = Customers.Login 
    WHERE Orders.Status_ID = '5' 
    AND (DATE(Orders.Time) BETWEEN '$start_date' AND '$end_date') 

,旨在使我得到我的范围,或者从订单信息,优惠卡的用户订购的产品。当我第一次写它时,它似乎工作正常,但最近我被告知它冻结了,我不知道为什么。我试着玩一下它,似乎当我添加日期范围,或者甚至只是单一的日期搜索条件时,它会冻结(可以在PHPMyAdmin中永久显示'Loading'弹出窗口);除此之外,执行大约需要1秒。

Here's what EXLAIN gives me.

+0

你为什么在外部查询中使用distinct。在内部查询中试用它,您认为可能出现的重复来自 – Avi

+0

如果我们没有从那里获取任何列,我们为什么要加入Customer和Discount_Card表? – Avi

+0

你如何执行这个,使用PHP? –

回答

0

好吧,显然抛出内加入了Discount_cards并用WHERE替代它修复了这个问题:

SELECT DISTINCT 
    Products.Product_name 
    FROM Order_details 
    INNER JOIN Products 
    ON Products.Product_codenumber = Order_details.Product_codenumber 
    INNER JOIN Orders 
    ON Order_details.Order_ID = Orders.Order_ID 
    INNER JOIN Customers 
    ON Orders.Customer_ID = Customers.Customer_ID 
    WHERE 
    Customers.Login IN (
     SELECT 
     Phone_number 
     FROM Discount_cards 
     ) 
    AND Orders.Status_ID = '5' 
    AND (DATE(Orders.Time) BETWEEN '$start_date' AND '$end_date') 

我不知道为什么这样做,冻结,虽然发生了,解释将不胜感激。