Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Оптимизация запроса
 
 автор: Sfinks   (07.02.2012 в 23:53)   письмо автору
 
 

Есть простенькая табличка:
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`

Может как-то красивше можно?

  Ответить  
 
 автор: cheops   (08.02.2012 в 12:22)   письмо автору
 
   для: 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`

  Ответить  
 
 автор: Sfinks   (08.02.2012 в 17:02)   письмо автору
 
   для: 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

Спасибо! =)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования