Получение результатов из одной таблицы, сгруппированной по пользователю и дате, объединенной по имени пользователя и информации об учетной записи из другой таблицы? - PullRequest
1 голос
/ 14 июля 2010

Допустим, у меня есть три таблицы (со столбцами в каждой):

ПОЛЬЗОВАТЕЛИ: id, имя, account_id

СЧЕТА: id, имя

СОБЫТИЯ: идентификатор события, идентификатор пользователя, дата

И я хочу получить общее количество событий из СОБЫТИЙ для каждого пользователя в диапазоне дат вместе с именем пользователя и именем учетной записи.

Я могу использовать GROUP BY, чтобы сгруппировать результаты по user_id, но как мне потом присоединить это к пользователям и учетным записям, чтобы получить эту информацию в каждой строке? Я пытаюсь получить вывод вроде:

+-------+---------------------+--------+

| name  | account_name        |count(*)|

+-------+---------------------+--------+

| Joe   | XYZ, Inc.           |     10 |

| Bob   | Vandalay Industries |     21 |

| Mary  | Account Name Here   |     32 |

+-------+---------------------+--------+

где третий столбец - общее количество событий в таблице EVENTS для этого user_id в указанном диапазоне дат.

Извините, я никогда не смогу освоить такие соединения ..

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Предполагая, что у вас есть столбец id в таблицах users и accounts

SELECT 
 users.name,
 accounts.name,
 count(events.event_id)
FROM
 users
 INNER JOIN events ON events.user_id = users.id
 INNER JOIN accounts ON accounts.id = users.account_id
WHERE
 events.date between <startdate> AND <enddate>
GROUP BY
 users.name,
 accounts.name
0 голосов
/ 14 июля 2010

Очевидные способы сделать это:

1) сгруппировать результаты запроса на соединение:

SELECT users.name, accounts.name, COUNT(*)
FROM users, accounts, events
WHERE users.account_id=accounts.id
AND users.id=events.user_id
WHERE events.date>$START_DATE
AND events.date<$END_DATE
GROUP BY users.name, accounts.name;

2) В качестве альтернативы, вы можете использовать консолидированный запрос только для событий какисточник данных и присоединиться к нему:

SELECT users.name, accounts.name, ilv.event_count
FROM (SELECT user_id, count(*)
  FROM events
  WHERE events.date>$START_DATE
  AND events.date<$END_DATE
  GROUP BY user_id) as ilv,
users, accounts
WHERE users.id=ilv.user_id
AND users.account_id=accounts.id;

HTH

C.

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