2009-06-18 16 views
4

これは、最終日に訪問した人の数をカウントするために書かれています。私はまた、最後の週と1年に何人が訪問したかを含め、3つの別々の問い合わせをせずにすべてを出力したい。3つのSQLクエリを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

何が問題なのですか? –

+0

先週と新しい年を新しい2つの新しい行または2つの列として追加するかどうかを指定しますか? – van

+0

最近これについていくつかの密接に関連する質問があります。 –

答えて

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 

これは、日、週、および合計によってそれらをグループ化し、年内の訪問をカウントします。

あなただけのこの使用、日、週3列での年間の訪問を選択したい場合:私はdidnの、「INTERVAL」構文に私を引用しないでください

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

これがSQL Server 2005で動作した場合、大きなインターネットハグを与えてしまいます。 – TheTXI

+0

TheTXI:そうです、AFAIK – Quassnoi

+0

@ TheTXI:もちろん、MySQLの日付機能をTSQLのものに置き換えることを条件とします。 WITH ROLLUPは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 

をそれを見て、私は自分自身TSQLの男だ。これは、組合でも達成できます。また、where句を結合の述部で置き換えることもできます。

1

さらに2行が必要な場合は、UNION ALLを使用します。まだ3種類のクエリがありますが、1つのクエリとして実行されます。

さらに2つの列が必要な場合は、SUM(CASE(...))を使用します。基本的には、WHERE句をCASE句に3回それぞれ独自の条件で追加します。

0

方法回以上のテーブルから参加したり、副選択する程度

です*()関数はブール関数(または式)です
SELECT count(*), IsToday(), IsThisWeek() 
    FROM whatever 
    WHERE IsThisYear() 
    GROUP BY IsToday(), IsThisWeek() 

+0

今週の本数を数えたいかどうかによって、クライアント側で追加する必要があるかもしれません。 – BCS

1

必要はありません。

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

不足している括弧BCSをありがとう。 –

関連する問題