无法过滤掉记录

时间:2017-06-23 10:31:30

标签: mysql sql

我有两张桌子:

proxies_meta

  • id - int
  • ip_address = varchar
  • current_status = int
  • 的updated_at

代理

  • id
  • IP_ADDRESS
  • 命中
  • 状态
  • 的updated_at

proxies_meta 就像所有IP地址所在的位置,而代理获取条目或在使用来自 proxies_meta 的IP时更新。

现在,在某一天,我必须选择尚未被禁止的代理IP status = 0hits每天不超过10。到目前为止,我试过这个但没有工作

select pm.ip_address as IP,sum(p.hits) as total_hits
from proxies_meta as pm
LEFT JOIN proxies as p
ON p.ip_address = pm.ip_address
AND pm.`current_status` = 0
AND date(p.updated_at) = '2017-06-23'
GROUP BY IP
having total_hits < 11 OR total_hits is NULL

只要状态为0proxies中没有记录,此查询就会有效。如果current_statusstatus已从0更改为-1,那么由于LEFT JOIN

而仍然会选择

如何确保我没有获取不需要的IP地址,并且还会检查每天的总点击次数?

1 个答案:

答案 0 :(得分:1)

我认为您只需将当前状态需求的条件移至where子句:

select pm.ip_address as IP, sum(p.hits) as total_hits
from proxies_meta pm left join
     proxies p 
     on p.ip_address = pm.ip_address and
        date(p.updated_at) = '2017-06-23'
where pm.current_status = 0
group by pm.ip_address
having total_hits < 11 or total_hits is null;

left join保留第一个表中的所有行,无论on子句的计算结果是true,false还是NULL。因此,第一个表上的条件不会过滤任何内容。对于实际过滤,第一个表上的条件需要在where子句中。