2009-06-18 7 views
4

Ceci est écrit pour compter le nombre de personnes ayant visité le dernier jour. Je veux également inclure combien ont visité dans la dernière semaine et l'année et l'ont sortie tout à fait sans faire 3 requêtes séparées.Comment combiner 3 requêtes SQL en 1?

SELECT COUNT(updated_at) AS 'TODAY' 
FROM parts_development.page_views p 
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 day) 
GROUP BY parts_user_id; 
+0

quelle est la question exatly? –

+0

spécifiez si vous voulez la semaine dernière et l'année comme deux nouvelles lignes ou deux colonnes supplémentaires? – van

+0

Il y a eu plusieurs questions connexes à ce sujet récemment. –

Répondre

3
SELECT DAY(updated_at), WEEK(updated_at), COUNT(*) AS visits 
FROM parts_development.page_views p 
WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 year) 
GROUP BY 
     DAY(updated_at), WEEK(updated_at) WITH ROLLUP 

Cela comptera des visites en un an, en les regroupant par jour, par semaine et au total.

Si vous voulez juste sélectionner des visites pour une journée, la semaine et un an dans trois colonnes, utilisez ceci:

SELECT (
     SELECT COUNT(*) 
     FROM parts_development.page_views p 
     WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 DAY) 
     ) AS last_day, 
     (
     SELECT COUNT(*) 
     FROM parts_development.page_views p 
     WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 7 DAY) 
     ) AS last_week, 
     (
     SELECT COUNT(*) 
     FROM parts_development.page_views p 
     WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 YEAR) 
     ) AS last_year 
+0

Si cela a fonctionné sur SQL Server 2005, je vous aurais donné de gros câlins internet. – TheTXI

+0

TheTXI: c'est le cas, AFAIK – Quassnoi

+0

@TheTXI: à condition de remplacer les fonctions de date MySQL par celles de TSQL, bien sûr. AVEC ROLLUP fonctionne sur SQL Server. – Quassnoi

0
SELECT COUNT(updated_at) AS 'TODAY' 
FROM parts_development.page_views day 
    INNER JOIN (SELECT COUNT(updated_at) AS 'WEEK', parts_user_id as userid 
       FROM parts_development.page_views p 
       WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 week) 
       GROUP BY parts_user_id) week 
     ON day.parts_user_id = week.userid 
    INNER JOIN (SELECT COUNT(updated_at) AS 'YEAR', parts_user_id as userweek 
       FROM parts_development.page_views p 
       WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 year) 
       GROUP BY parts_user_id) year 
     ON day.parts_user_id = year.userid 
WHERE day.updated_at >= DATE_SUB(NOW(),INTERVAL 1 day) 
GROUP BY day.parts_user_id 

Ne pas citer mon sur la syntaxe « INTERVALLE », je n Ne cherchez pas, je suis un gars TSQL moi-même. Cela pourrait également être accompli avec les syndicats. Vous pouvez également remplacer les clauses where par des prédicats dans les jointures.

1

Si vous souhaitez ajouter deux lignes supplémentaires, utilisez UNION ALL. Vous avez encore 3 requêtes mais vous les exécutez en une seule fois.

Si vous voulez deux autres colonnes, utilisez SUM (CASE (...)). Fondamentalement, vous plus votre clause WHERE à la clause CASE 3 fois chacun avec sa propre condition.

0

que diriez-vous

SELECT count(*), IsToday(), IsThisWeek() 
    FROM whatever 
    WHERE IsThisYear() 
    GROUP BY IsToday(), IsThisWeek() 

où les fonctions Is *() sont des fonctions booléennes (ou expressions)

+0

Selon si vous voulez compter aujourd'hui dans cette semaine, vous devrez peut-être faire un peu d'ajout du côté client car cette requête n'est pas – BCS

1

Pas besoin de se joindre ou subselect de la table plus d'une fois.

SELECT parts_user_id, 
      SUM(IF(updated_at >= DATE_SUB(NOW(), INTERVAL 1 DAY), 1, 0)) 
      as day_visits, 
      SUM(IF(updated_at >= DATE_SUB(NOW(), INTERVAL 7 DAY), 1, 0)) 
      as week_visits, 
      count(*) as year_visits 
     FROM parts_development.page_views 
    WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 year) 
    GROUP BY parts_user_id 
+0

Merci pour les parenthèses manquantes BCS. –

Questions connexes