计算前100行中的匹配项

时间:2014-05-08 11:48:53

标签: mysql

正如标题所述,我正在尝试计算某个表中最后100条记录中的匹配数。

此查询有效,但数据非常动态,在该特定表上有大量插入,并且正在运行类似的查询,并且它们最终都非常慢(20秒)可能会相互阻塞。

因为缓存结果是不可接受的(数据必须是实时的)我正在考虑将外部查询切换到PHP,即使我知道它会更慢,因为它仍然会比20秒更快。

这是查询

SELECT count(*) as matches
FROM (
  SELECT first_name FROM customers
  WHERE division = 'some_division'
  AND type = 'employee'
  ORDER BY request_time DESC
  LIMIT 0, 100
) as entries
WHERE first_name = 'some_first_name_here'

我正在寻找一种更优化的执行相同任务的方法,而不必在PHP中实现它,因为这是天真/明显错误的方法。

表格如下所示:

id first_name last_name type division request_time

只是为了直截了当,由于NDA原因,这显然不是实际的表/数据,但是,表格看起来与不同的列名完全相同。

所以,我想要实现的目标是在最近100条有一些约束的记录中找到匹配的数量。

例如,

how many times does the name 'John' appear within the last 100 employees added in the HR division?

2 个答案:

答案 0 :(得分:0)

我明白了。

这样的事情怎么样......

 SELECT i 
   FROM 
      ( SELECT CASE WHEN first_name = 'some_first_name_here' THEN @i:=@i+1 END i 
          FROM customers
         WHERE division = 'some_division'
           AND type = 'employee'
             , (SELECT @i:=0)val  
         ORDER 
            BY request_time 
          DESC        
         LIMIT 0,100
      ) n 
  ORDER 
     BY i DESC 
  LIMIT 1;

答案 1 :(得分:0)

试试这个:

SELECT SUM(matches)
FROM
(
    SELECT IF(first_name = 'some_first_name_here', 1, 0) AS matches
    FROM customers
    WHERE division = 'some_division' AND type = 'employee'
    ORDER BY request_time DESC
    LIMIT 0,100
) AS entries