2009-06-18 7 views
4

Dies wird geschrieben, um zu zählen, wie viele Personen innerhalb des letzten Tages besucht haben. Ich möchte auch angeben, wie viele Besucher die letzte Woche und das letzte Jahr besucht haben, und sie insgesamt ausgeben lassen, ohne 3 separate Abfragen durchzuführen.Wie kombiniere ich 3 SQL-Abfragen in 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

was die Frage sehr? –

+0

angeben, wenn Sie letzte Woche und Jahr als neue zwei neue Zeilen oder zwei weitere Spalten möchten? – van

+0

In letzter Zeit gab es mehrere eng damit verbundene Fragen. –

Antwort

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 

Diese Besuche innerhalb eines Jahres zählen wird, gruppieren sie nach Tag, Woche und insgesamt.

Wenn Sie nur für einen Tag besucht auswählen möchten, Woche und einem Jahr in drei Spalten verwenden:

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

Wenn das auf SQL Server 2005 funktionierte, hätte ich Ihnen große Internet-Umarmungen gegeben. – TheTXI

+0

TheTXI: es tut, AFAIK – Quassnoi

+0

@TheTXI: vorausgesetzt, dass Sie MySQL-Datumsfunktionen mit TSQL-Einsen natürlich ersetzen. WITH ROLLUP funktioniert auf 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 

nicht meine zitieren Sie auf dem „Interval“ Syntax, ich didn schau es nicht an, ich bin selbst ein TSQL-Typ. Dies könnte auch mit Gewerkschaften erreicht werden. Sie können die Where-Klauseln auch durch Prädikate in den Joins ersetzen.

1

Wenn Sie zwei weitere Zeilen benötigen, verwenden Sie UNION ALL. Sie haben immer noch 3 Abfragen, werden aber als eine ausgeführt.

Wenn Sie zwei weitere Spalten benötigen, verwenden Sie SUM (CASE (...)). Grundsätzlich hast du mehr als deine WHERE-Klausel in der CASE-Klausel jeweils 3 mal mit eigener Bedingung.

0

wie etwa

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

wo die I *() Funktionen Booleschen Funktionen (oder Ausdrücke) sind

+0

Je nachdem, ob Sie heute in dieser Woche zählen möchten, müssen Sie möglicherweise einige Ergänzungen auf der Client-Seite vornehmen, da diese Abfrage nicht – BCS

1

Keine Notwendigkeit, aus der Tabelle mehr beizutreten oder subselect als einmal.

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

Danke für das fehlende Parens BCS ist. –

Verwandte Themen