У меня есть таблица базы данных MySQL, в которой одна ячейка содержит несколько дат, и я хочу выбрать все строки, содержащие ячейку, где одна или несколько дат больше, чем сегодняшняя дата, возможно ли это? (используя PHP)
Конечно:
select * from MyTable where MyDate > Now()
Как ваше одно поле содержит несколько дат? Возможно, вам стоит рассмотреть отдельную таблицу для этого.
«Одна ячейка содержит несколько дат» .. суть проблемы. Вот три варианта.
Начните с адекватно нормированной схемы – в частности, любой столбец / «ячейка» может иметь не более одной даты (или фрагмента информации). Это может потребовать или не потребовать введения другой таблицы в зависимости от роли информации.
Этот подход является масштабируемым и работает в рамках проекта RDMBS / RA, и, если это будет сделано, другие представленные запросы будут «просто работать».
(Это, безусловно, самый лучший вариант и должен быть сделан, если это вообще возможно. Надлежащая нормализация также должна вести дальнейшую разработку схемы для смягчения таких проблем в будущем).
Создайте нормализованное представление денормализованной таблицы (или такой запросифицирующий запрос), который может быть JOIN
ed. Затем используйте один из предложенных вариантов (которые работают на нормализованной схеме), хотя и в крайне невыгодном положении, поскольку не могут использовать индексы.
Это ужасно грязно, но это можно сделать. См. SELECT де-нормированные столбцы в отдельные записи? для примера. (Обратите внимание на соотношение синтезированных строк здесь, хотя некоторые базы данных [не MySQL] также поддерживают табличные функции и кросс-приложения таких.)
Этот подход не масштабируется, потому что он не может использовать индексы.
Выбираем каждую строку. Петля и использование explode
и т. Д., Если это необходимо.
Этот подход не масштабируется из-за отсутствия индексов и требует, чтобы все данные извлекались локально.
Хотя поиск равных значений в денормализованных столбцах может быть осуществлен с помощью различных хаков (например, FIND_IN_SET
), поиск относительных (т.е. больших / меньших) значений невозможен с использованием тех же методов. Решение, которое работает в обоих случаях, – это исправление базовой схемы.
Если поле DATE
или DATETIME
вы можете использовать
SELECT * FROM table WHERE datefield > NOW()
Если вы только после DATE
а не DATETIME
вы можете использовать CURDATE()
вместо NOW()