Задавайте вопросы, мы ответим
Вы не зашли.
CREATE TABLE test (
_id int(11) NOT NULL auto_increment,
_code varchar(16) NOT NULL default '',
_date int(11) NOT NULL default '0',
PRIMARY KEY (_id),
KEY _code (_code)
) TYPE=MyISAM;
Начиная с некоей даты D (_date>D) надо выбрать одну следующую запись, или X следующих записей, если разность по полю _date между ними не превышает Y.
Извиняюсь, что мудрено, мозги закипают уже.
Неактивен
Если таблица небольшая, то лучше всего подходит способ "в лоб":
SELECT * FROM test WHERE _date > X ORDER BY _date LIMIT 1
UNION
SELECT * FROM test WHERE _date BETWEEN X AND (X+Y);
Неактивен
В том-то и заковыка, что блок дат может отстоять от D не на величину Y, а на любую. Надо лишь, чтобы искомые даты лежали в пределах Y.
Например, идут в таблице даты
1
5
6
При Y=2 даты 5 и 6 не попадут в выборку.
Неактивен
Упс, я в предыдущем примере почему-то решил, что дата-параметр - Х. А она - D.
Правильно читать
SELECT * FROM test WHERE _date > D ORDER BY _date LIMIT 1
UNION
SELECT * FROM test WHERE _date BETWEEN D AND (D+Y);
Неактивен
Да, я обратил внимание, но сути дела это не меняет.
По второму селекту будут выбраны ближайшие два дня, т.е. ни одной записи.
А в действительности должны быть выбраны 5-е и 6-е.
Отредактированно persty (31.03.2009 19:41:54)
Неактивен
Ну да, они выбраны не будут, т.е. будет выбрана одна строка с пятеркой из первого селекта.
Ровно по требованию "надо выбрать одну следующую запись" т.к. разница превышает Y в данном случае.
Неактивен
Согласен, я не четко сформулировал условие (между ними можно трактовать как между D и искомыми).
Правильно так
Начиная с некоей даты D (_date>D) надо выбрать одну следующую запись, или X следующих записей, если разность по полю _date между множеством записей X не превышает Y.
Неактивен
Не понимаю. Пример приведите, пожалуйста
Пусть есть строки 1, 6, 7, 17, 18, 37.
Какие-нибудь комбинации D, X, Y и вывода, чтобы было понятно, что Вы хотите
Неактивен
Я, кажется, понял, что нужно: в любом случае выбирается запись с _date > D. Затем выбирается следующая - вторая - если между ней и первой разница меньше Y, затем - третья, если между третьей и второй разница меньше Y и т.д..
Долго раздумывал над этой задачей. На мой взгляд, есть единственный способ; несколько извращенно выглядит, но зато работает, вроде, правильно (и даже ключи использовать должен, если понадобится):
Неактивен
Верно, но несколько проще. Если совсем точно:
Затем выбирается следующая - вторая - если между ней и первой разница меньше Y, затем - третья, если между третьей и первой разница меньше Y и т.д..
И надо еще учесть, что могут быть одинаковые даты. Например, при последовательности 2,2,3,8,10 и Y=4 по запросу выше будут выбраны только 2,3, тогда как надо 2,2,3.
Да и сам запрос... пока никак у меня не пашет, выбирает только первую запись с _date > D...
Отредактированно persty (01.04.2009 16:18:40)
Неактивен
Коллеги, может я не врубился в задачу, но почему не получается так:
SELECT test.* FROM test JOIN (SELECT _date FROM test t2 WHERE t2._date > D LIMIT 0, 1) t3 ON (test._date >= t3._date) WHERE test._date <= DATE_SUB(t3._date, INTERVAL +Y DAY) LIMIT 0, X
Неактивен
"Буратино был тупой..." (С)
Не могу осилить логику последнего запроса мне, видимо, не дано. Мудрено как-то.
Придется вытягивать все даты диапазона отдельным запросом, затем обрабатывать PHP, затем вторым запросом вытягивать уже записи с установленнымим датами.
Всем большое спасибо, в процессе задавания вопросов задача стала яснее.
Неактивен
Persty, а сам запрос-то работает или Вы не пробовали?
Логика проста: сначала вытаскиваем первую запись, которая больше даты D (
Неактивен
Урра, заработало! Тепрь я все понял, логика ясна. Не работало, потому что я в одном месте пропустил FROM_UNIXTIME для даты. Спасибо!
Неактивен