Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySQL]Сделать запрос к базе данных для выбора, не просроченных записей... 
V
    Опции темы
DeamonShan
Дата 22.5.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



есть таблица:

id name time   status
1 Ivan  125485936 1
2 Serg 5448755155 3

итд

Статусы: 1, 2, 3, 4...

time - timestamp

как вывести список пользователей за последние две недели со статусом не равной 1?? при этом пользователи со статусом 3 вообще не должны выводится...

то есть:

"selest * from table where stat<>3"

сюда еще добавить условие, если  запись двухнедельной давности и его статус 1, то тоже не выбирать...
PM MAIL   Вверх
Magnifico
Дата 22.5.2008, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



timestamp в разных субд обрабатывается по разному , а в неккоторых субд (MSSQLServer) вообще не иммет никакого
отношения к датеВремени


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
DeamonShan
Дата 22.5.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



тип поля time BIGINT, а значение от функции time() в ПХП... я это хотел сказать)))
PM MAIL   Вверх
skyboy
Дата 22.5.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Код

SELECT *
FROM `table`
WHERE `status` <> 3 AND `status` <> 1 AND DATE_ADD(DATE(`time`), INTERVAL 2 WEEKS)< DATE(NOW()) 

в принципе, вызов DATE() не обязателен. просто, чтоб у тебя выводились и записи в пределах текущих суток, даже если поле time старее на 2 недели + 1 секунда.
Цитата(Magnifico @  22.5.2008,  10:24 Найти цитируемый пост)
в разных субд

в заголовке указано MySQL  smile

Добавлено через 53 секунды
Цитата(DeamonShan @  22.5.2008,  10:37 Найти цитируемый пост)
а значение от функции time()

о-па. а почему не хранишь дату/время в специально предназначенном типе поля? лениво, что ли?
тогда мой запрос не подходит.
PM MAIL   Вверх
DeamonShan
Дата 22.5.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



skyboy, помоему твой запрос (даже при правильном типе поля time) исключит все строки со статусом 3 и 1.... и выведет строки со стаусами отличными от 3 и 1 и да посл две недели... а нужно чтоб новые записи за последние две недели со статусом 1 тоже выводились... но в тоже время исключались только старые записи со статусом 1... 

а время так храню, потому что при вычислениях оно мне надо))) не удобно каждый раз вызывать mktime()....

Добавлено через 3 минуты и 40 секунд
то есть условие просрочки относится только к строке со статусом 1...
PM MAIL   Вверх
skyboy
Дата 22.5.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(DeamonShan @  22.5.2008,  10:54 Найти цитируемый пост)
а нужно чтоб новые записи за последние две недели со статусом 1 тоже выводились... но в тоже время исключались только старые записи со статусом 1... 

ещё раз и внятнее.
есть оператор OR. есть оператор AND. есть скобки. группируй, как тебе надо.
Цитата(DeamonShan @  22.5.2008,  10:54 Найти цитируемый пост)
 потому что при вычислениях оно мне надо)))

давай подумаем. сколько в том формате, в котором хранишь, составляет две недели?
PM MAIL   Вверх
Magnifico
Дата 22.5.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Код

select * from tbl
where (status <>3    or  status = 1)  and  (date > DATE_SUB(now(), INTERVAL 14 day)  and  date  <  now())   


а чё подзапросы MYSQL 5 не поддерживает (говорит не могу повторно открыть одну и туже таблицу) ?


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
DeamonShan
Дата 22.5.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



Код

select * from tbl where status<>3 and (status=1 and data>'".(time()-$Prosrochka*24*60*60)."') order by data desc;


вот мой вариант но не работает...

условие data> time() - 2 week относится только к строкам со статусом 1, а к остальным никак не должен!!!

Добавлено @ 12:38
Мне нужно исключить строки со статусом 1 записанные две недели (и раньше) назад..... а новые строки со статусом 1 и записанные в течении 2 недель нужно выводить... при этом исключить все строки со статусом 3))))))))))))))))))))))))

Добавлено @ 12:38
Цитата(Magnifico @ 22.5.2008,  12:26)
Код

select * from tbl
where (status <>3    or  status = 1)  and  (date > DATE_SUB(now(), INTERVAL 14 day)  and  date  <  now())   


а чё подзапросы MYSQL 5 не поддерживает (говорит не могу повторно открыть одну и туже таблицу) ?

Хм... поподробнее плиииз...

Это сообщение отредактировал(а) DeamonShan - 22.5.2008, 12:39
PM MAIL   Вверх
DeamonShan
Дата 22.5.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



результат должен содержать:

строки со статусом 1, новые (за посл две недели..)
строки со статусом 2, все
строки со статусом 4, все

не должен содержать:

строки со статусом 3, все
строки со статусом 1, старые (2 недельной давности... и больше)

PM MAIL   Вверх
Magnifico
Дата 22.5.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Цитата

Хм... поподробнее плиииз... 

Твою задачу пытался решить подзапросом 
Код

select * from tbl
where status <>3    and  (data > DATE_SUB(now(), INTERVAL 14 day)  and  data  <  now())   
or  status in
(
select status from Tbl
where   status = 1  and  (data > DATE_SUB(now(), INTERVAL 14 day)  and  data  <  now())  
)

ошибка 1137 Can't reopen table Tbl

а требовние к твоему результату изменилось , раньше ты не говорил что 
строки со статусом 2, все
строки со статусом 4, все


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
DeamonShan
Дата 22.5.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



нет с самого начала я это и имел ввиду, наверное не правильно излагался(((

в общем, вот такая задача:

результат должен содержать:

строки со статусом 1, новые (за посл две недели..)
строки со статусом 2, все
строки со статусом 4, все

не должен содержать:

строки со статусом 3, все
строки со статусом 1, старые (2 недельной давности... и больше)


из таблицы:

name          time             status
ivan         1212154           1   - эта запись новая
serg         6565659           2
tolik         5645454           4
qwert       6546455           1   - эту запись ввели две недели назад, ато и раньше
qwer2      4644488           3


тогда результатом будет:

ivan
serg
tolik
PM MAIL   Вверх
Magnifico
Дата 22.5.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Код

select * from tbl
where ((status <>3    or  status = 1)  and  (data > DATE_SUB(now(), INTERVAL 14 day)  and  data  <  now()) )  or
status in (2,4)



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
DeamonShan
Дата 22.5.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: нет
Всего: 6



Цитата(Magnifico @ 22.5.2008,  13:10)
Код

select * from tbl
where ((status <>3    or  status = 1)  and  (data > DATE_SUB(now(), INTERVAL 14 day)  and  data  <  now()) )  or
status in (2,4)

а если статусов больше? все перечислять???
PM MAIL   Вверх
Magnifico
Дата 22.5.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



тогда нужен подзапрос а как он работает в mysql я не знаю


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
skyboy
Дата 22.5.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(Magnifico @  22.5.2008,  11:26 Найти цитируемый пост)
говорит не могу повторно открыть одну и туже таблицу

таблица часом не временная?

Добавлено через 17 секунд
Цитата(Magnifico @  22.5.2008,  12:15 Найти цитируемый пост)
а как он работает в mysql

нормально он работает.

Добавлено через 2 минуты и 24 секунды
Код

select * from tbl
where status <>3   and  (data < DATE_SUB(now(), INTERVAL 14 day)  or status <> 1)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.