-1

可能重复:如何从日期时间列中选择日期?

但是接受答案的问题是它将执行全表扫描。

我想做这样的事情:

UPDATE records SET earnings=(SELECT SUM(rate) 
FROM leads 
WHERE records.user_id=leads.user_id 
   AND DATE(leads.datetime)=records.date)

注意最后一部分:DATE(leads.datetime)=records.date. 这正是它需要做的,但它必须扫描每一行。一些用户有数千个潜在客户,因此可能需要一段时间。

leads桌子上有一个INDEX, 。user_iddatetime

我知道您可以使用区间函数并执行类似WHERE datetime BETWEEN date AND interval + days或类似的操作。

最有效和最准确的方法是什么?

4

2 回答 2

3

我不熟悉 MySQL 中的日期函数,但尝试将其更改为

UPDATE records SET earnings=
  (SELECT SUM(rate) 
   FROM leads 
   WHERE records.user_id=leads.user_id 
     AND  leads.datetime >= records.date
     And  leads.datetime < records.date [+ one day])  -- however you do that in MySQL

您将获得完整的表扫描,因为表达式DATE(leads.datetime)不是Sargable。这是因为它是一个需要对存储在表的列中的值进行操作的函数,并且该函数也存储在该列的任何索引中。显然,函数的值不能预先计算并存储在任何索引中,只能存储实际的列值,因此没有索引搜索可以确定哪些行在对其执行函数后满足 Where 子句谓词中表达的条件. 更改表达式以使列值本身位于 where 子句运算符(等号或其他)的一侧或另一侧,从而允许基于单个表达式搜索索引中的列值。

于 2013-07-29T03:24:28.777 回答
2

你可以试试这个:

UPDATE records
    SET earnings = (SELECT SUM(rate)
                    FROM leads
                    WHERE records.user_id=leads.user_id AND
                          leads.datetime >= records.date and
                          leads.datetime < date_add(records.date, interval 1 day)
                   );

You need an index on leads(user_id, datetime) for this to work.

于 2013-07-29T03:24:51.150 回答