MySQL: нет строки, как в группе? - PullRequest
0 голосов
/ 04 ноября 2010

У меня есть два столбца в таблице: VisitorID и URL.

В таблице существует запись для каждого просмотра страницы, который делает посетитель.Я хотел бы видеть общее количество посещений для каждого посетителя, где ни один из URL-адресов в группе посетителей не похож на "% page = checkout%".

Я думаю, что-то вроде этого:

SELECT *, COUNT(*) AS TotalVisits
FROM `VisitorLog`
GROUP BY VisitorID
HAVING `URL` NOT IN (SELECT * FROM ?? WHERE `URL` LIKE "%page=checkout%")

Но я не совсем понимаю, как предложение HAVING работает с подзапросом, если мне вообще нужен подзапрос и т. Д.?А как заставить иметь отрицательный?

И бонусные баллы для тех, кто может объяснить ответ, чтобы я мог сделать это сам в следующий раз!

Спасибо,

Ник

Ответы [ 3 ]

1 голос
/ 04 ноября 2010
SELECT *, COUNT(*) AS TotalVisits
FROM `VisitorLog`
WHERE 
    VisitorID NOT IN 
        (SELECT VisitorID FROM `VisitorLog` WHERE `URL` LIKE '%page=checkout%')
GROUP BY VisitorID
0 голосов
/ 04 ноября 2010

Я предполагаю, что ваше URL поле в таблице visitorLog является Foreign_key и целочисленным полем.

SELECT v1.VisitorID, COUNT(v1.VisitorID) AS TotalVisits
FROM `VisitorLog` v1, ?? as v2
WHERE v1.URL = v2.URL_ID
AND v2.URL NOT LIKE "%page=checkout%"
GROUP BY VisitorID

Насколько я понимаю, например.

id      visitor_id    datetime    page
1       1             Nov4        about us
2       1             Nov4        contact us
3       2             Nov4        about us
4       2             Nov3        about us
5       2             Nov4        home
6       1             Nov4        home


    select visitor_id, count(id) as numberofvisits 
    FROM visit_table_transaction 
    WHERE datetime = "Nov4"
    GROUP BY visitor_id
    HAVING numberofvisits > 2

So the result is 
visitor_id      numberofvisits
1               3

Зачем вам нужноиспользуйте having, потому что агрегатную функцию нельзя использовать в WHERE

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

Вы также можете написать так

select visitor_id, count(id) as numberofvisits 
FROM visit_table_transaction 
WHERE datetime = "Nov4"
GROUP BY visitor_id
HAVING count(id) > 2

Ниже это неправильно

 select visitor_id, count(id) as numberofvisits 
 FROM visit_table_transaction 
 WHERE datetime = "Nov4"
 AND count(id) > 2
 GROUP BY visitor_id 

Любой, пожалуйста, поправьте меня, если я ошибаюсь.Спасибо.

0 голосов
/ 04 ноября 2010
select VisitorID, count(*)
from VisitorLog
where (select count(*) from VisitorLog v2 where v2.VisitorID = VisitorLog.VisitorID and v2.URL like '%page=checkout%') = 0
;
...