#php #mysql #date #getdate
#php #mysql #Дата #getdate
Вопрос:
Обновить
Я создаю серверную часть веб-сайта. Основная цель веб-сайта — предоставить посетителям четкий обзор того, когда и какие мероприятия мы организуем.
Итак, я заполнил базу данных всеми видами деятельности. У каждого действия есть дата, имя и некоторая другая информация.
Совершенно очевидно, что посетителям не помогает отображение действий в прошлом, поэтому я хочу, чтобы они показывали только предстоящие действия. И чтобы сэкономить много работы, было бы неплохо выполнить всю работу PHP / MySQL и показывать посетителям только 2 следующих события.
Можете ли вы посоветовать мне функцию MySQL для этого?
Заранее спасибо,
Комментарии:
1. Erm. PHP не имеет прямого доступа к вашей базе данных . Это означает, что вы не используете функцию PHP для получения чего-либо из MySQL. Не могли бы вы еще немного подумать и перефразировать это?
2. Когда вы говорите «ближайшая к сегодняшнему дню», вы имеете в виду действия до сегодняшнего дня, после сегодняшнего (предполагая, что у вас есть действия в будущем), или и то, и другое?
3. @Alin Purcaru: да, верно, виноват. Конечно, я имел в виду MySQL. Я не настолько опытен в PHP, поэтому мне просто интересно. Вы понимаете, чего я пытаюсь достичь? Или вам нужна дополнительная информация?
4. @d.syph. 3r Я имею в виду действия до сегодняшнего дня. База данных заполнена действиями, как прошлыми, так и будущими. Те, что были в прошлом, приведены только для нашей информации, те, что будут в будущем, — для посетителей. Поэтому я хочу отобразить только те, которые появятся в будущем.
5. @Alin Purcaru У меня недостаточно информации, чтобы точно знать, чего вы хотите. Я могу только догадываться. Вам следует отредактировать вопрос и добавить больше деталей.
Ответ №1:
Просто несколько советов:
Выберите ближайшие 2 события до текущего момента и ближайшие 2 после текущего момента.
(SELECT *
FROM ...
WHERE `time` < NOW()
ORDER BY `time` DESC
LIMIT 2)
UNION
(SELECT *
FROM ...
WHERE `time` > NOW()
ORDER BY `time` ASC
LIMIT 2)
На данный момент у вас будет не более 4 событий в PHP. Но вам нужно только 2. Ближайшие 2. Чтобы узнать, какие из них являются наиболее близкими, вы используете strtotime
и проверяете различия между временными метками событий и текущей временной меткой, которую вы можете получить, позвонив time()
. После этого вы сохраняете только 2 ближайших события.
Обратите внимание, что этого можно достичь непосредственно из MySQL, но так сложнее.
@Последнее обновление. Достаточно прочитать это, если вы не хотите знать больше.
Просто используйте этот запрос:
SELECT *
FROM ...
WHERE `time` > NOW()
ORDER BY `time` ASC
LIMIT 2
Комментарии:
1. Это сделало свое дело! Большое спасибо. Это хорошо с точки зрения производительности, если у меня около 2000 действий?
2. В 2000 году это не имеет большого значения. Но на всякий случай добавьте индекс в
time
столбец.3. Подойдет 🙂 Спасибо! (Почему это не имеет значения с 2000. Это происходит, когда их примерно 5?)
4. @Michiel Я имел в виду, что это не имеет большого значения, потому что 2000 — это не очень большое число.
5. Я думаю, вы можете использовать UNION ALL в этом случае, что и следует, поскольку это более эффективно.
Ответ №2:
Вы можете использовать DATEDIFF
и ABS
…
SELECT * FROM `activities` ORDER BY ABS(DATEDIFF(NOW(), `date`)) LIMIT 2
Из обновленного вопроса следует учитывать только будущие действия … Итак…
SELECT * FROM `activities` WHERE `date` > NOW() ORDER BY `date` LIMIT 2
Комментарии:
1. Быстрое решение. Но с точки зрения производительности слишком много событий. Вы не можете добавить индекс к такому выражению, но вы можете добавить его в столбец time.
Ответ №3:
$query = 'SELECT .... FROM ... WHERE `date` > '.$today.' ORDER BY `date` DESC LIMIT 2';
$today
зависит от вашего date
типа столбца.
Комментарии:
1. Изменение PHP $today на MySQL NOW() остановит внедрение SQL и по-прежнему всегда будет предоставлять соответствующую информацию, независимо от типа столбца ‘date’.
2. Только если «сегодня» является реальным сегодня 🙂