Как вычислить предполагаемое значение?

gloomen

Новичок
Как вычислить предполагаемое значение?

Всем привет, народ помогите решить задачку.

Есть таблица, в которой на каждый день в году имееться запись/строка: дата | произвольное значение
И так, сегодня 6 апреля, через запрос: $res = mysql_query("SELECT id FROM year WHERE date='06.04.2010' LIMIT 1"); могу найти значение
А, что если запись на 6 апреля отсутствует...И автоматически поиск должен выдать запись на 5 апреля (т.е. по убываниею.),
а если нет записи на 5 апреля тогда на 4 апреля и так до тех пор пока не найдёться ближайшие значение от сегоднешнего числа.

Заранее благодарен, спасибо!
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
gloomen
http://phpfaq.ru/slashes#mysql
1. Ctrl+F "обратная кавычка"
2. Для хранения даты времени - есть специальный тип поля, который для этого предназначен.
 

Вурдалак

Продвинутый новичок
Сортировать можно только даты в формате YYYY-MM-DD, потому что только их можно прямо сравнивать. Это так, к слову.

-~{}~ 06.04.10 18:55:

Кстати, лучше вместо ORDER BY ... LIMIT 1 делать подзапрос
[sql]SELECT MAX(...) WHERE ... < '2010-04-04'[/sql]
 

Вурдалак

Продвинутый новичок
Gas
Вариант prolis'а содержит, как минимум, логическую ошибку. Он просто нерабочий.

С другой стороны, у него делается сортировка. Сортировка выполняется всегда дольше поиска максимального элемента.

-~{}~ 07.04.10 00:42:

Но я не настаиваю. :)
 

zerkms

TDD infected
Команда форума
Вурдалак
Попробуй почитать по ссылке. LIMIT 1 с сортировкой по индексированному полю будет не медленнее MAX(), а если вспомнить, что тебе придётся сделать, чтобы выбрать весь ряд - то твой вариант очень громко причмокнет.

если ты до сих пор не понимаешь того, о чём я говорю - то предлагаю написать с использованием предложенного тобой MAX'а аналог следующему запросу:

SELECT * FROM `table` WHERE `date` <= '2010-04-07' ORDER BY `date` DESC LIMIT 1

время пошло.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Вурдалак
Експлайны в студию?
 

zerkms

TDD infected
Команда форума
Вурдалак
Не надо ничего проверять пока - хотя бы напиши аналогичный запрос, потом посмотрим.
 

Gas

может по одной?
Експлайны в студию?
эксплейны могут быть не на пользу order + limit, explain фигово учитывает наличие limit'а, поэтому в rows может писаться куча строк, хотя реально по индексу сразу будут найдены нужные.

Как будет возможность — проверю.
проверь, но результат очевиден если представить как mysql выполняет поподобные запросы. Твой вариант с MAX тоже будет работать быстро, даже примерно как и order+limit, но кода будет больше, а смысла нет.

-~{}~ 07.04.10 00:14:

Не надо ничего проверять пока - хотя бы напиши аналогичный запрос, потом посмотрим.
дык Вурдалак же писал про подзапрос в самом начале, предполагал что вместо константы и "не равно", ставится равно и подзапрос на получение даты, убирается order by.
 

zerkms

TDD infected
Команда форума
Gas
его вариант не может работать так же быстро, как и ORDER BY, хотя бы потому, что ему придётся делать 2 запроса, вместо одного.

explain фигово учитывает наличие limit'а, поэтому в rows может писаться куча строк, хотя реально по индексу сразу будут найдены нужные.
он его вообще не учитывает, если быть предельно честным :))

-~{}~ 07.04.10 08:17:

дык Вурдалак же писал про подзапрос в самом начале, предполагал что вместо константы и "не равно", ставится равно и подзапрос на получение даты.
вот я и хочу увидеть итоговый запрос с подзапросом, который будет на порядок сложнее моего :)

-~{}~ 07.04.10 08:18:

убирается order by.
да знаю я, как он выглядит :) мне хотелось чтобы и автор реплики тоже увидел что он предложил :)
 

Gas

может по одной?
он его вообще не учитывает, если быть предельно честным :))
в 5.1 в простых случаях учитывается, order + limit 1 (без where) - explain в rows показывает 1, а на 4.1 и 5.0 показывает количество, сравнимое с количеством строк в таблице.

его вариант не может работать так же быстро, как и ORDER BY, хотя бы потому, что ему придётся делать 2 запроса, вместо одного.
про так-же быстро я не говорю, но разница может оказаться не очень большой. Например, если нужных индексов нет в кеше, то подзапрос, получая дату, их в кеш подгребает, а основной запрос быстро берёт уже всё готовенькое. Но на эту тему продолжать особо не хочу, мы оба представляем как что работает :)
 

zerkms

TDD infected
Команда форума
в 5.1 в простых случаях учитывается, order + limit 1 (без where) - explain в rows показывает 1, а на 4.1 и 5.0 показывает количество, сравнимое с количеством строк в таблице.
хм... никогда не замечал. всегда вроде было именно оценочное число выгребаемых рядов. да и mysqlperformanceblog писали об этом же недавно... надо внимательнее приглядеться будет, значит.
 

Вурдалак

Продвинутый новичок
Автор оригинала: zerkms
Вурдалак
Не надо ничего проверять пока - хотя бы напиши аналогичный запрос, потом посмотрим.
— что-то вроде
[sql]SELECT * FROM `table` WHERE `date` = (SELECT MAX(`date`) FROM `table` WHERE `date` < '2010-04-07' ) LIMIT 1[/sql]

Автор оригинала: zerkms
его вариант не может работать так же быстро, как и ORDER BY, хотя бы потому, что ему придётся делать 2 запроса, вместо одного.
— сам следи за тем, что говоришь :)
 

zerkms

TDD infected
Команда форума
Вурдалак
и? т.е. по-твоему подзапрос - это не запрос?

этот запрос 100% будет медленнее. ссылки я дал, EXPLAIN ты знаешь.
 

Вурдалак

Продвинутый новичок
Автор оригинала: zerkms
и? т.е. по-твоему подзапрос - это не запрос?
— нет, я не об этом. Ты же прекрасно понимаешь, что иногда 10 запросов могут выполнится намного быстрее, чем 1, поэтому это:
его вариант не может работать так же быстро, как и ORDER BY, хотя бы потому, что ему придётся делать 2 запроса, вместо одного.
— не аргумент.

Но сейчас проверил — ваша правда, мой запрос выполняется чуть медленнее.
 

zerkms

TDD infected
Команда форума
Вурдалак
его не нужно было выполнять - достаточно почитать об оптимизации, чтобы понять, как работает mysql в случае выполнения обоих запросов.
 
Сверху