计算满足给定条件的记录

时间:2017-05-07 10:48:02

标签: mysql sql

我有一个包含以下架构的表:

+-------------------------------------------------------+
|                   table_counter                       |
+----+---------------------+------------+---------------+
| id |      timestamp      | entry_type |    country    |
+----+---------------------+------------+---------------+
+----+---------------------+------------+---------------+
| 10 | 2017-05-01 12:00:00 |    click   |    Germany    |
+----+---------------------+------------+---------------+
| 11 | 2017-05-01 12:00:00 |    view    |    Austria    |
+----+---------------------+------------+---------------+
| 12 | 2017-05-01 12:00:00 |    click   |       UK      |
+----+---------------------+------------+---------------+
| 13 | 2017-05-01 12:00:00 |    view    |      USA      |
+----+---------------------+------------+---------------+

我需要返回以下结果:按过去30天内的观看总和选择前5个国家/地区的观看次数和点击次数。

我知道如何计算记录,但我如何定义约束?如何退回view s最多的五个国家/地区的所有参赛作品?

将结果限制在过去30天是微不足道的,但我在开始时几乎停滞不前。

2 个答案:

答案 0 :(得分:1)

使用order by和limit关键字,

SELECT SUM(IF(entry_type = "view", 1, 0)) as view_count FROM t3 GROUP BY country, entry_type ORDER BY view_count DESC LIMIT 5

<强> - 修改

根据评论中的要求,这里是更新的查询:

SELECT SUM(view_click_count) as all_total FROM (SELECT country, SUM(IF(entry_type = "view", 1, 0)) as view_count, SUM(IF(entry_type = "click", 1, 0)) as click_count, count(entry_type) as view_click_count FROM t3 GROUP BY country ORDER BY view_count DESC LIMIT 5) t2

all_total根据需要为前5个国家/地区提供总计数。

答案 1 :(得分:1)

您可以通过以下查询获得前5个国家/地区的视图,例如:

SELECT country, count(*) as 'views'
FROM table
WHERE timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()
AND entry_type = 'view'
GROUP BY country
ORDER BY count(*) DESC
LIMIT 5

现在,要选择clicks,您可以在SELECT中添加另一个查询,例如:

SELECT t.country, COUNT(*) as 'views',
(SELECT COUNT(*)
 FROM `table`
 WHERE country = t.country
 AND entry_type = 'click'
 AND timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()
) as 'clicks'
FROM `table` t
WHERE t.timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()
AND t.entry_type = 'view'
GROUP BY t.country
ORDER BY count(*) DESC
LIMIT 5

这是 SQL Fiddle

<强>更新

要获得视图和点击的总和,请将上述查询包装到另一个SELECT中,例如:

SELECT country, views + clicks
FROM(
  SELECT t.country, COUNT(*) as 'views',
    (SELECT COUNT(*)
     FROM `table`
     WHERE country = t.country
     AND entry_type = 'click'
     AND timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()
    ) as 'clicks'
    FROM `table` t
    WHERE t.timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()
    AND t.entry_type = 'view'
    GROUP BY t.country
    ORDER BY count(*) DESC
    LIMIT 5
  ) b;

以下是更新的 SQL Fiddle