在子查询中使用JOINS进行MySQL查询太慢

时间:2018-12-29 08:19:06

标签: mysql join subquery

我有一个包含“产品”和链接的“ products_prices”表的数据库。我正在尝试获取符合特定条件的所有“产品”的平均“ products_prices.price”。诀窍在于,我不需要特定日期的平均价格,而是查询分组当天(包括该天)之前所有价格的总平均价格。我可能不太清楚。

例如,如果我在第一天列出了2种产品,价格为$ 100,则结果的第一行将显示当天的“ totalCount” = 2和“ totalSum” = $ 200。如果在第2天以150美元的价格添加了另一个价格,那么结果中现在将有2行,第二行显示'totalCount'= 3,'totalSum'= $ 350。

因此,查询应该在当天之前添加所有符合条件的记录的计数。

这有意义吗?

我有一个查询,该查询似乎在执行我想要的操作,但速度非常慢。我很确定这是因为我在子查询中使用了JOINS。

SELECT pp.created_at,

    (SELECT COUNT(products_prices.id) FROM products_prices 
        INNER JOIN products ON products_prices.product_id = products.id 
        WHERE products_prices.created_at <= pp.created_at
       AND products.make LIKE '%Beneteau%'  
       AND length_feet >= 47
       AND length_feet <= 52
       AND products_prices.marked_as_sold <> 1
       ) AS totalCount,

    (SELECT SUM(products_prices.price) FROM products_prices
       INNER JOIN products ON products_prices.product_id = products.id 
       WHERE products_prices.created_at <= pp.created_at
       AND products.make LIKE '%Beneteau%'
       AND length_feet >= 47
       AND length_feet <= 52
       AND products_prices.marked_as_sold <> 1
       ) AS totalSum

FROM products_prices pp
GROUP BY DAY(pp.created_at) 
ORDER BY created_at

这是该查询产生的结果...

created_at  totalCount  totalSum
2018-11-29 00:00:00 0   
2018-11-30 00:00:00 0   
2018-12-01 09:58:14 0   
2018-12-02 04:58:13 0   
2018-12-03 13:15:14 0   
2018-12-04 04:45:12 0   
2018-12-05 01:15:13 0   
2018-12-06 10:15:13 0   
2018-12-07 11:26:41 0   
2018-12-08 00:00:13 2   504000
2018-12-09 01:05:07 2   504000
2018-12-10 01:05:08 2   504000
2018-12-11 00:45:12 2   504000
2018-12-12 01:00:14 2   504000
2018-12-13 01:05:08 2   504000
2018-12-14 01:18:10 2   504000
2018-12-15 00:02:13 2   504000
2018-12-16 00:45:12 2   504000
2018-12-17 00:02:13 2   504000
2018-12-18 01:05:08 2   504000
2018-12-19 00:02:14 11  2535500
2018-12-20 01:05:08 12  2724500
2018-12-21 00:02:14 13  2973500
2018-12-22 00:20:30 13  2973500
2018-12-23 01:15:06 13  2973500
2018-12-24 01:11:09 13  2973500
2018-12-25 01:28:07 13  2973500
2018-12-26 01:25:06 13  2973500
2018-12-27 00:02:09 13  2973500
2018-12-28 00:02:11 13  2973500

必须有更好的方法来做到这一点。任何人有任何想法吗?

最新建议是这个...

SELECT pp.created_at                 ,
COUNT(pp.id) totalCount,
SUM(pp.price) totalSum
FROM products_prices pp
INNER JOIN products 
ON pp.product_id = products.id
GROUP BY DAY(pp.created_at)
HAVING pp.created_at <= pp.created_at
AND  products.make LIKE '%Beneteau%'
AND  length_feet >= 47
AND  length_feet <= 52
AND  pp.marked_as_sold <> 1
ORDER BY created_at;

但是它会抛出“在“具有从句”中的未知列'products.make'”

1 个答案:

答案 0 :(得分:0)

当然-在子查询中使用联接很慢

但是MySQL支持DESCRIBE

我怀疑您需要创建一些索引

LIKE是一个非常缓慢的语句-在索引中非常困难

也许从以下开始:

SELECT id from products WHERE make LIKE '%Beneteau%';

将其存放起来,然后使用:

AND product_id IN ([the id's you stored])

然后在product_id,length_feet和marked_as_sold上创建一些索引