mysql查询太慢,子查询中有连接

lsmepo6l  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(369)

我有一个数据库,有'产品'和链接'产品价格'表。我试图得到所有符合特定标准的“产品”的平均“产品价格”。诀窍是我不需要某一天的平均价格,而是查询分组前(包括分组当天)所有价格的合计平均价格。我可能解释得不太清楚。
例如,如果我有两个产品在第一天以100美元的价格列出,那么第一行的结果将显示“totalcount”=2和“totalsum”=200美元。如果第二天另一个价格是150美元,那么结果中现在会有两行,第二行显示“totalcount”=3,“totalsum”=350美元。
因此,查询应该将符合条件的所有记录的计数添加到它自己的日期之前。
这有道理吗?
我有一个查询,似乎做我想要的,但它是非常缓慢。我很确定这是因为我在子查询中使用了连接。

  1. SELECT pp.created_at,
  2. (SELECT COUNT(products_prices.id) FROM products_prices
  3. INNER JOIN products ON products_prices.product_id = products.id
  4. WHERE products_prices.created_at <= pp.created_at
  5. AND products.make LIKE '%Beneteau%'
  6. AND length_feet >= 47
  7. AND length_feet <= 52
  8. AND products_prices.marked_as_sold <> 1
  9. ) AS totalCount,
  10. (SELECT SUM(products_prices.price) FROM products_prices
  11. INNER JOIN products ON products_prices.product_id = products.id
  12. WHERE products_prices.created_at <= pp.created_at
  13. AND products.make LIKE '%Beneteau%'
  14. AND length_feet >= 47
  15. AND length_feet <= 52
  16. AND products_prices.marked_as_sold <> 1
  17. ) AS totalSum
  18. FROM products_prices pp
  19. GROUP BY DAY(pp.created_at)
  20. ORDER BY created_at

以下是此查询生成的结果。。。

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

一定有更好的办法。有人有什么想法吗?
最新的建议是。。。

  1. SELECT pp.created_at ,
  2. COUNT(pp.id) totalCount,
  3. SUM(pp.price) totalSum
  4. FROM products_prices pp
  5. INNER JOIN products
  6. ON pp.product_id = products.id
  7. GROUP BY DAY(pp.created_at)
  8. HAVING pp.created_at <= pp.created_at
  9. AND products.make LIKE '%Beneteau%'
  10. AND length_feet >= 47
  11. AND length_feet <= 52
  12. AND pp.marked_as_sold <> 1
  13. ORDER BY created_at;

但它抛出“未知列”产品。make'in'having子句”

sy5wg1nm

sy5wg1nm1#

当然-在子查询中使用联接很慢
但是mysql支持描述
我想你需要创建一些索引
like是一个非常慢的语句,在索引中非常困难
可以从以下几个方面开始:

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

储存起来,然后使用:

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

然后在产品标识、长度和英尺上创建一些索引,并将其标记为已售出

相关问题