|
|
|
| Есть простенькая табличка:
CREATE TABLE `visits` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_user` int(10) unsigned default NULL,
`dt` timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
В нее добавляются записи при каждом посещении авторизованным пользователем.
Дамп примерно такой:
INSERT INTO `visits` (`id`, `id_user`, `dt`) VALUES
(1, 3, '2012-02-07 18:58:00'),
(2, 1, '2012-02-07 18:58:16'),
(3, 1, '2012-02-07 18:58:21'),
(4, 1, '2012-02-07 18:58:24'),
(5, 3, '2012-02-07 18:59:18'),
(6, 3, '2012-02-07 18:59:39'),
(7, 3, '2012-02-07 19:05:36');
|
И нужно раз в сутки выбрать id_user пользователей, которые были больше 3-ех раз.
Вроде просто, но какой-то не красивый запрос у меня получился:
SELECT `visits`.`id_user` AS `id_user` FROM `visits`
JOIN (
SELECT `id_user` , count(`id`) AS `co` FROM `visits` GROUP BY `id_user`
) `b` ON ( `visits`.`id_user` = `b`.`id_user` )
WHERE `b`.`co` > 3 GROUP BY `visits`.`id_user`
|
Может как-то красивше можно? | |
|
|
|
|
|
|
|
для: Sfinks
(07.02.2012 в 23:53)
| | Лучше перенести условие `b`.`co` > 3 внутрь вложенного запроса, задействовав HAVING
SELECT
`visits`.`id_user` AS `id_user`
FROM
`visits`
JOIN (
SELECT
`id_user`,
count(`id`) AS `co`
FROM
`visits`
GROUP BY
`id_user`
HAVING
`co` > 3) `b`
USING(`id_user`)
GROUP BY
`visits`.`id_user`
|
| |
|
|
|
|
|
|
|
для: cheops
(08.02.2012 в 12:22)
| | Во! Так я не знал про существование слова HAVING! Зачем тогда вообще вложенный запрос? Я вложенность делал только для того, чтоб можно было к `co` обратиться. Ведь нельзя в одном запросе написать SELECT count(`id`) AS `co` и WHERE `co`>3. А так пожалуйста:
SELECT `id_user`, count(`id`) AS `co` FROM `visits` GROUP BY `id_user` HAVING `co` > 3
|
Спасибо! =) | |
|
|
|