Guest User

Untitled

a guest
Nov 23rd, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. SELECT COUNT( returning_visitors.per_ip ) AS count, AVG( returning_visitors.per_ip ) AS num_visits
  2. FROM (
  3. SELECT COUNT( * ) AS per_ip
  4. FROM site_hits_unique
  5. WHERE site_hits_unique.site_id = ___INPUT___
  6. AND site_hits_unique.date >= CURDATE( ) - INTERVAL 30 DAY
  7. GROUP BY site_hits_unique.site_id, site_hits_unique.ip
  8. HAVING per_ip >1
  9. ) AS returning_visitors
  10.  
  11. SELECT id, COUNT( returning_visitors.per_ip ) as readers, AVG( returning_visitors.per_ip ) as avg_visits_pr
  12. FROM sites
  13. SUBQUERY-PER-ROW (
  14. SELECT COUNT( * ) AS per_ip
  15. FROM site_hits_unique
  16. WHERE site_hits_unique.site_id = sites.id
  17. AND site_hits_unique.date >= CURDATE( ) - INTERVAL 30 DAY
  18. GROUP BY site_hits_unique.site_id, site_hits_unique.ip
  19. HAVING per_ip > 1
  20. ) AS returning_visitors
  21. WHERE sites.id IN (162888, 42705, 11412)
  22.  
  23. SELECT id, (
  24. SELECT COUNT( per_ip ) AS count, AVG( per_ip ) AS num_visits
  25. FROM (
  26. SELECT COUNT( * ) AS per_ip
  27. FROM site_hits_unique
  28. WHERE site_hits_unique.site_id = sites.id
  29. AND site_hits_unique.date >= CURDATE( ) - INTERVAL 30 DAY
  30. GROUP BY site_hits_unique.site_id, site_hits_unique.ip
  31. HAVING per_ip >1
  32. ) AS returning_visitors
  33. ) as (readers, avg_visits_pr)
  34. FROM sites
  35. WHERE sites.id IN (162888, 42705, 11412)
  36.  
  37. SELECT s.id,
  38. COUNT( rv.per_ip ) as readers,
  39. AVG( rv.per_ip ) as avg_visits_pr
  40. FROM sites AS s
  41. JOIN
  42. (
  43. SELECT u.site_id,
  44. COUNT( * ) AS per_ip
  45. FROM site_hits_unique AS u
  46. WHERE u.date >= CURDATE( ) - INTERVAL 30 DAY
  47. GROUP BY u.site_id, u.ip
  48. HAVING per_ip > 1
  49. ) AS rv ON rv.site_id = s.id
  50. WHERE s.id IN (162888, 42705, 11412)
  51.  
  52. site_hits_unique: INDEX(site_id, date, ip)
  53.  
  54. SELECT site_id,
  55. COUNT(DISTINCT ip) as readers,
  56. COUNT(*) / COUNT(DISTINCT ip) as avg_visits_pr
  57. FROM
  58. (
  59. SELECT site_id, ip, COUNT(*) AS per_ip
  60. FROM site_hits_unique
  61. WHERE date >= CURDATE( ) - INTERVAL 30 DAY
  62. AND site_id IN (162888, 42705, 11412)
  63. GROUP BY site_id, ip
  64. HAVING per_ip > 1
  65. ) AS rv
  66. GROUP BY site_id;
  67.  
  68. DELIMITER $$
  69.  
  70. CREATE PROCEDURE get_site_readers(
  71. IN input_site_id INT,
  72. OUT readers INT,
  73. OUT avg_visits_pr DOUBLE)
  74. BEGIN
  75.  
  76. SELECT COUNT( per_ip ), AVG( per_ip )
  77. INTO readers, avg_visits_pr
  78. FROM (
  79. SELECT COUNT( * ) AS per_ip
  80. FROM site_hits_unique
  81. WHERE site_id = input_site_id
  82. AND date >= CURDATE( ) - INTERVAL 30 DAY
  83. GROUP BY site_id, ip
  84. HAVING per_ip > 1
  85. ) AS returning_visitors;
  86.  
  87. END
  88.  
  89. DELIMITER $$
  90.  
  91. CREATE PROCEDURE update_site_readers() BEGIN
  92. DECLARE done BOOLEAN DEFAULT FALSE;
  93. DECLARE _id BIGINT UNSIGNED;
  94. DECLARE cur CURSOR FOR SELECT id FROM sites;
  95. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
  96.  
  97. OPEN cur;
  98.  
  99. eachSite: LOOP
  100. FETCH cur INTO _id;
  101. IF done THEN
  102. LEAVE eachSite;
  103. END IF;
  104. CALL get_site_readers(_id, @readers, @avg_visits_pr);
  105. UPDATE sites SET readers = @readers, avg_visits_pr = @avg_visits_pr WHERE id=_id;
  106. END LOOP eachSite;
  107.  
  108. CLOSE cur;
  109. END
  110.  
  111. CALL update_site_readers();
Add Comment
Please, Sign In to add comment