Как мне объединить 3 SQL-запроса в 1? - PullRequest
4 голосов
/ 18 июня 2009

Это написано, чтобы подсчитать, сколько людей посетили за последний день. Я хочу также указать количество посещений за последнюю неделю и год, и сделать вывод в целом без выполнения 3 отдельных запросов.

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;

Ответы [ 6 ]

3 голосов
/ 18 июня 2009
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

Это будет считать посещения в течение года, группируя их по дням, неделям и общему количеству.

Если вы просто хотите выбрать посещения на день, неделю и год в трех столбцах, используйте это:

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
2 голосов
/ 18 июня 2009

Оператор SQL UNION http://www.w3schools.com/sql/sql_union.asp

1 голос
/ 19 июня 2009

Нет необходимости присоединяться или выбирать из таблицы более одного раза.

    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
1 голос
/ 18 июня 2009

Если вы хотите еще две строки, используйте UNION ALL. У вас все еще есть 3 запроса, но они выполнены как один.

Если вам нужны еще два столбца, используйте SUM ( CASE (...)). В основном вы добавляете свое предложение WHERE к предложению CASE 3 раза каждый с собственным условием.

0 голосов
/ 18 июня 2009

как насчет

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

где функции Is * () - логические функции (или выражения)

0 голосов
/ 18 июня 2009
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

Не цитируйте мой синтаксис "INTERVAL", я его не искал, я сам парень по TSQL. Это также может быть достигнуто с помощью профсоюзов. Вы также можете заменить предложения where на предикаты в объединениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...