Привет всем интересующимся.
Недавно зашла речь о решении ниже представленной задачи. Решалось все на салфетках, так что в общем вопрос был в концепте решения, а не в конкретном запросе.
Я предложил свой вариант, но меня осадили, сообщив, что так не выйдет, надо использовать подзапросы. Решение было названо в корне неправильным. Спорить не было ни времени, ни аргументов.
Не будучи специалистом высокого класса, я предложил что-то вроде
"select name,count(times) as c from users left join stats on users.id=stats.id group by name;"
это НЕ РЕШЕНИЕ задачи. Это, так сказать, направление мысли. А
вот что я придумал, когда добрался до компьютера. По-моему это правильное решение, без подзапросов.
Прошу гуру прокомментировать мой вариант.
Задача:
Существует две таблицы: пользователи и статистика. В таблице пользователей два поля:
идентификатор и имя. В таблице статистики так же два поля: идентификатор пользователя и
время посещения спортивного клуба.
Необходимо сконструировать запрос, результатом работы которого будет два столбца:
имя пользователя и количество визитов за последнюю неделю. Результат необходимо отобразить для тех пользователей, которые посетили заведение не менее двух или ни одного раза за указанный период.
Версия доступного mysql 5.1.40-community.
Пояснения к моему решению (добавлено позже):
В тексте задачи есть формулировка "не меньше двух", в коде записано >2. Задача изначально стояла именно о "больше двух". Это моя ошибка в описании задачи.
В запросе есть участок, который отсекает записи "из будущего". Изначально тестовая база содержала случайные данные, в том числе из будущего.
create database test_simpsons;
use test_simpsons;
drop table if exists `users`;
CREATE TABLE `users` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(50),
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
insert into users (`id`,`name`) values ("1", "Homer");
insert into users (`id`,`name`) values ("2", "Marge");
insert into users (`id`,`name`) values ("3", "Bart");
insert into users (`id`,`name`) values ("4", "Lisa");
insert into users (`id`,`name`) values ("5", "Maggie");
drop table if exists `stats`;
CREATE TABLE `stats` (
`id` int(10) NOT NULL,
`times` timestamp
) ENGINE=MyISAM;
insert into stats (`id`,`times`) values ("1", now()-interval 1 day);
insert into stats (`id`,`times`) values ("1", now()-interval 3 day);
insert into stats (`id`,`times`) values ("1", now()-interval 5 day);
insert into stats (`id`,`times`) values ("1", now()-interval 9 day);
insert into stats (`id`,`times`) values ("1", now()-interval 6 day);
insert into stats (`id`,`times`) values ("1", now()-interval 2 day);
insert into stats (`id`,`times`) values ("2", now()-interval 7 day);
insert into stats (`id`,`times`) values ("2", now()-interval 2 day);
insert into stats (`id`,`times`) values ("2", now()-interval 6 day);
insert into stats (`id`,`times`) values ("3", now()-interval 1 day);
insert into stats (`id`,`times`) values ("3", now()-interval 3 day);
insert into stats (`id`,`times`) values ("3", now()-interval 9 day);
insert into stats (`id`,`times`) values ("3", now()-interval 4 day);
insert into stats (`id`,`times`) values ("3", now()-interval 2 day);
insert into stats (`id`,`times`) values ("4", now()-interval 7 day);
insert into stats (`id`,`times`) values ("3", now()-interval 8 day);
insert into stats (`id`,`times`) values ("3", now()-interval 8 day);
insert into stats (`id`,`times`) values ("3", now()-interval 8 day);