2013-10-01 4 views
0

visit MySQL таблицы:Получить Посещение Считает из разных мест

+---------+-------------+------------+--------+---------------------+ 
| visitId | visitSiteId | homeSiteId | userId |  time   | 
+---------+-------------+------------+--------+---------------------+ 
| 1  |  1  |  1  | 1001 | 2013-09-01 11:50:12 | 
| 2  |  1  |  1  | 1001 | 2013-09-03 12:50:12 | 
| 3  |  2  |  1  | 1001 | 2013-09-04 13:50:12 | 
| 4  |  2  |  1  | 1001 | 2013-09-07 11:00:00 | 
| 5  |  2  |  1  | 1001 | 2013-09-09 12:32:12 | 
| 6  |  2  |  1  | 1001 | 2013-09-13 15:48:12 | 
| 7  |  2  |  2  | 1002 | 2013-09-01 11:00:12 | 
| 8  |  2  |  2  | 1002 | 2013-09-02 12:50:12 | 
| 9  |  2  |  2  | 1002 | 2013-09-05 13:50:12 | 
| 10 |  1  |  2  | 1002 | 2013-09-06 11:50:12 | 
| 11 |  1  |  2  | 1002 | 2013-09-07 12:50:12 | 
| 12 |  2  |  2  | 1002 | 2013-09-15 13:50:12 | 
+---------+-------------+------------+--------+---------------------+ 

отчеты посетить DateTime, сайт посетили и домашних пользователей сайта

Я хочу найти способ вывода 3 Отчеты От приведенных выше данных.

  1. Возврат любых пользователей, у которых есть счетчик посещений на домашней странице> = HomeSite Visit Count; any Дата
  2. Возврат любых пользователей, у которых есть счетчик посещений на домашней странице> = a Минимальное количество целых чисел, например. Non Home Count> = 10
  3. И 1 и 2 с диапазоном дат, т.е. время> = '2013-09-01 11:50:12' И время < = '2013-09-13 15:48:12'

Я новичок в MySQL и бороться с синтаксисом подзапроса так был бы признателен за любую помощь: запросов Ниже будет возвращать счетчики посещений на дому и не домашней Визиты, но я не могу получить мою голову вокруг подзапроса комбинированного результата

SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site <> v.HomeSite GROUP BY v.user_id; 
SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site = v.HomeSite GROUP BY v.user_id; 
SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site <> v.HomeSite AND v.Time >= '2013-09-01 11:50:12' AND v.Time <= '2013-09-13 15:48:12' GROUP BY v.user_id; 
SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site = v.HomeSite AND v.Time >= '2013-09-01 11:50:12' AND v.Time <= '2013-09-13 15:48:12' GROUP BY v.user_id; 

Вот таблица MySQL Create и INSERT Data для оказания помощи при тестировании:

CREATE TABLE `dbName`.`visit`(`visitId` INT(11) NOT NULL AUTO_INCREMENT, `visitSiteId` INT(11), `homeSiteId` INT(11), `userId` INT(11), `time` DATETIME, PRIMARY KEY (`visitId`)); 

INSERT INTO `dbName`.`visit`(`visitSiteId`,`homeSiteId`,`userId`,`time`) VALUES 
    (1,1,1001,'2013-09-01 11:50:12'), 
    (1,1,1001,'2013-09-03 12:50:12'), 
    (2,1,1001,'2013-09-04 13:50:12'), 
    (2,1,1001,'2013-09-07 11:00:00'), 
    (2,1,1001,'2013-09-09 12:32:12'), 
    (2,1,1001,'2013-09-13 15:48:12'), 
    (2,1,1002,'2013-09-01 11:00:12'), 
    (2,1,1002,'2013-09-02 12:50:12'), 
    (2,1,1002,'2013-09-05 13:50:12'), 
    (1,1,1002,'2013-09-06 11:50:12'), 
    (1,1,1002,'2013-09-07 12:50:12'), 
    (2,1,1002,'2013-09-15 13:50:12'); 
+0

К сожалению, расположение не вышло, как в текстовом редакторе. Запросы внизу вопроса будут строить и вставлять данные таблицы. – FLOG51

+0

И каков желаемый результат для каждого требуемого отчета на основе предоставленных выборочных данных или комбинированного отчета (BTW это не ясно из вашего вопроса)? – peterm

ответ

0

Не Испытанный ..

SELECT Count(visitId) AS Visits, userId 
    FROM homeSiteId 
    GROUP BY visitId HAVING Count(visitId) > 2999 
+0

Не то, что я за. В частности, мне нужно не посещать дома, а не дома. – FLOG51

0

Это довольно просто. Вы должны использовать оператор CASE для подсчета посещений домашнего сайта и не домашнего сайта отдельно.

Query 1

select userid 
    from (
    select userid, 
     count(case when visitsiteid = homesiteid then 1 end) homesitecount, --count only those records where home site = visited site 
     count(case when visitsiteid != homesiteid then 1 end) nonhomesitecount --count only those records where home site != visited site 
    from visit 
    group by userid) as groupedvisit    --use this as inline view and filter out the users. 
where nonhomesitecount >= homesitecount; 

Query 2

select userid, 
     count(case when visitsiteid != homesiteid then 1 end) nonhomesitecount 
    from visit 
group by userid 
having count(case when visitsiteid != homesiteid then 1 end) > 3; 

Следующая запросы похожи на Query1 и 2. Вы должны добавить дополнительный пункт, где ограничить дату.

where time >= lower_limit and time <= upper_limit 

Demo в sqlfiddle

0

ОБНОВЛЕНО: Если правильно понимаю, что вы хотите, вы можете сделать это, как этот

1. Возвращение любых пользователей, которые имеют Non Главная сайта посещений > = HomeSite Visit Count; любая дата

SELECT userid, 
     SUM(visitsiteid <> homesiteid) visitsnonhome, 
     SUM(visitsiteid = homesiteid) visitshome 
    FROM visit 
GROUP BY userid 
HAVING visitsnonhome >= visitshome; 

2. Возврат любых пользователей, имеющие Беспоставочный Главный сайт Посещать Count> = а минимальные целое число вошло

SELECT userid, 
     SUM(visitsiteid <> homesiteid) visitsnonhome, 
     SUM(visitsiteid = homesiteid) visitshome 
    FROM visit 
GROUP BY userid 
HAVING visitsnonhome >= 3; 

3. Оба 1 и 2 с диапазоном дат ...

Просто добавьте пункт WHERE выше упомянутых запросы

SELECT userid, 
     SUM(visitsiteid <> homesiteid) visitsnonhome, 
     SUM(visitsiteid = homesiteid) visitshome 
    FROM visit 
WHERE time >= '2013-09-01 11:50:12' 
    AND time <= '2013-09-13 15:48:12' 
GROUP BY userid 
HAVING visitsnonhome >= visitshome; 

SELECT userid, 
     SUM(visitsiteid <> homesiteid) visitsnonhome, 
     SUM(visitsiteid = homesiteid) visitshome 
    FROM visit 
WHERE time >= '2013-09-01 11:50:12' 
    AND time <= '2013-09-13 15:48:12' 
GROUP BY userid 
HAVING visitsnonhome >= 3; 

Вот SQLFiddle демо

+0

Спасибо, что движется в правильном направлении, только что отсутствует, я хочу вернуть счетчики как для домашнего, так и для домашнего сайта. – FLOG51

+0

например. Результат будет выглядеть так: – FLOG51

+0

userId, VisitsNonHome, VisitsHome 1001, 4, 2 1002, 4, 2 – FLOG51

Смежные вопросы