我有一个包含“产品”和链接的“ 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'”
答案 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上创建一些索引