Я запускаю сервер MySQL. В моей базе данных у меня есть таблица для запросов регистрации страниц:Выберите пять самых высоких записей:
CREATE TABLE IF NOT EXISTS `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` smallint(5) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`page` varchar(127) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Я хочу получать список журналов, такой, что только за последние пять записей любого пользователя, посещающим определенную страницу показаны. Например, если какой-либо пользователь посетил некоторую страницу семь раз, отображаются только последние пять записей. Кроме того, запрос должен возвращать все записи.
я придумал следующий запрос:
SELECT *
FROM `log`
WHERE `time` >
(SELECT `time` FROM `log` as l
WHERE `l`.`userId`=`log`.`userId` AND `l`.`page`=`log`.`page`
ORDER BY `time` DESC LIMIT 5,1)
ORDER BY `time` DESC
подзапрос должен выбрать пятую запись. Это прекрасно работает. Однако, когда пользователь не посещал определенную страницу более пяти раз, ничего не возвращается, потому что подзапрос не может найти результат (я думаю). Как я могу заставить его работать и в этом случае?
Большое спасибо. Я попробовал первый вариант, но MySQL жалуется на самый глубокий подзапрос, не имеющий псевдонима. После добавления псевдонима он еще жалуется: «Неизвестный столбец« log.adminId »в разделе« where clause ». Второй вариант говорит: «Эта версия MySQL еще не поддерживает« LIMIT & IN/ALL/ANY/SOME подзапрос ». – Keelan
@CamilStaps. , ,Я беспокоился об этих двух проблемах. Если я подумаю о чем-нибудь еще, я отредактирую ответ. –
Соединяется ли с производным запросом тоже не может быть и речи? Похоже, что первый ответ будет работать, если синтаксис правильный. –