ВЫБРАТЬ, чтобы выбрать пользователей, которые оба просмотрели страницу - PullRequest
1 голос
/ 29 января 2010

У меня есть таблица, в которой регистрируются просмотры страниц каждого пользователя:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| view_id      | int(11)      | NO   | PRI | NULL    | auto_increment | 
| page_id      | int(11)      | YES  | MUL | NULL    |                | 
| user_id      | int(11)      | YES  | MUL | NULL    |                | 
+--------------+--------------+------+-----+---------+----------------+

Для каждой пары пользователей я бы хотел подсчитать сколько страниц они просмотрели .

Я просто не знаю, как это сделать. :) Я использую mysql, на случай, если он имеет нестандартную функцию, которая делает это проще простого.

Ответы [ 4 ]

3 голосов
/ 29 января 2010
select u1.user_id, u2.user_id, count(distinct u1.page_id) as NumPages
from logtable u1
  join
  logtable u2
  on u1.page_id = u2.page_id
  and u1.user_id < u2.user_id /* This avoids counting pairs twice */
group by u1.user_id, u2.user_id;

Но вам стоит подумать об этом ...

(отредактировано выше, чтобы поставить u1.page_id, изначально это был просто page_id, что очень плохо для меня)

2 голосов
/ 29 января 2010
SELECT DISTINCT page_id
FROM logtable
WHERE user_id = 1 OR user_id = 2
GROUP BY page_id
HAVING COUNT(DISTINCT user_id) = 2

Эта таблица возвращает все просмотренные ими страницы. Если вам нужен подсчет, просто сделайте это подзапросом и посчитайте строки.

SELECT COUNT(*) FROM (the query above) s;

Обновление, давайте сделаем это для всех пар пользователей.

SELECT u1.user_id, u2.user_id, COUNT(DISTINCT u1.page_id)
FROM logtable u1, logtable u2
WHERE u1.user_id < u2.user_id
  AND u1.page_id = u2.page_id
GROUP BY u1.user_id, u2.user_id
0 голосов
/ 29 января 2010

Для users_ids 100 и 200.

SELECT
  page_id
FROM table1
WHERE user_id IN (100, 200)
GROUP BY page_id
HAVING MAX(CASE WHEN user_id = 100 THEN 1 ELSE 0 END) = 1
  AND MAX(CASE WHEN user_id = 200 THEN 1 ELSE 0 END) = 1;
0 голосов
/ 29 января 2010
select a.user_id as user1, b.user_id as user2, count(distinct a.page_id) as views
from yourtable a, yourtable b
where a.page_id = b.page_id 
and a.user_id < b.user_id
group by a.user_id, b.user_id

замените yourtable на имя вашей таблицы ..

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