Mysql - 从复杂的标准中获取结果

标签 mysql sql

我的数据库包含许多网站的统计信息,目前我遇到了一个相当复杂的查询问题,我不知道该怎么做(或者是否可能)。

我有 2 个表:websitesvisits。前者是所有网站及其属性的列表,而前者是每个用户对特定网站的访问列表。

我正在制作的程序应该获取需要“扫描”的网站。每个站点每次扫描之间的间隔取决于该网站过去 30 天的总访问次数。这是一个包含预期扫描间隔的表格:

enter image description here

这些表具有以下结构:

网站 enter image description here

访问 enter image description here

我想要的是一个查询,该查询返回过去其各自更新截止日期的网站(可以从last_scanned 栏)。

这在单个查询中是否可以轻松实现?

最佳答案

您可以尝试以下方法:

SELECT main.* 
FROM ( 
  SELECT
    w.web_id,
    w.url,
    w.last_scanned,
    (SELECT COUNT(*)
     FROM visits v
     WHERE v.web_id = w.web_id
       AND TIMESTAMPDIFF(DAY,v.added_on, NOW()) <=30
    ) AS visit_count,
    TIMESTAMPDIFF(HOUR,w.last_scanned, NOW()) AS hrs_since_update
  FROM websites w
  ) main
WHERE
  (CASE 
    WHEN visit_count >= 0 AND visit_count <= 10 AND hrs_since_update >= 4320 THEN 1
    WHEN visit_count >= 11 AND visit_count <= 100 AND hrs_since_update >= 2160 THEN 1
    WHEN visit_count >= 101 AND visit_count <= 500 AND hrs_since_update >= 1080 THEN 1
    WHEN visit_count >= 501 AND visit_count <= 1000 AND hrs_since_update >= 720 THEN 1
    WHEN visit_count >= 1001 AND visit_count <= 2000 AND hrs_since_update >= 360 THEN 1
    WHEN visit_count >= 2001 AND visit_count <= 5000 AND hrs_since_update >= 168 THEN 1
    WHEN visit_count >= 5001 AND visit_count <= 10000 AND hrs_since_update >= 72 THEN 1
    WHEN visit_count >= 10001 AND hrs_since_update >= 24 THEN 1
    ELSE 0 
  END) = 1;

这是 fiddle 演示:http://sqlfiddle.com/#!9/1f671/1

关于Mysql - 从复杂的标准中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593603/

相关文章:

php - 复选框检查数据库数据

sql - OPENROWSET - 文件名中的空格问题

sql - 使用 Sequelize 即时创建新表

mysql - SQL group by 从分组中排除 NULL 值

php - 在复杂 MySQL 查询中使用变量

sql - 是否有一个聚合函数可以返回组内的第一个非空值?

php - 如何搜索 mysql 表,以便它只返回包含存储在另一个表中的可选 Actor 列表的 DVD?

php - 在 MySQL 中获取 start_date 和 end_date 内的项目

mysql - 如何检查查询中的条件。

php - Yii 中的统计查询