SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.08.2017 00:57:54

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Помогите составить запрос

Здравствуйте.
Помогите с запросом.. изломал голову.

Исходные данные такие:
есть два солбца, date и id.
id это обычный id с автоинкрементов, date Это проста дата.
Логика работы в том, что запись можно добавить в любую дату. Если представить себе хронологию ведения записей по датам, то можно упорядочить сначала всё по дате, потом в рамках каждой даты по id. В данном случае, иллюстрация по дате и id  по убыванию:
http://i.imgur.com/d4GnNjN.png
Теперь вопрос.
Я, имея некий id на руках, хочу получить "предыдущий".
ну, то есть, если я имею 3, то получить надо 6. Если 4, то 3.

Полдня просидел, чё-то не получается (
главоболя.

Отредактированно inmerdorm (09.08.2017 01:01:15)

Неактивен

 

#2 09.08.2017 07:43:38

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Помогите составить запрос

SELECT id
FROM table_name
WHERE date <= (SELECT date FROM table_name WHERE id = :ID)
  AND id < :ID
ORDER BY date DESC, id DESC
LIMIT 1;
Где :ID некий id на руках.

Отредактированно klow (09.08.2017 07:46:44)

Неактивен

 

#3 09.08.2017 12:02:02

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: Помогите составить запрос

klow,

так не покатит, потому что условие AND id < :ID будет выбирать только те id, которые меньше данной цифры. А они могут быть и больше. Например, для "3" результат должен быть "6", а этот код выдаёт "2".

Неактивен

 

#4 09.08.2017 12:21:00

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: Помогите составить запрос

Собственно, давайте не упираться вот так в задачу, давайте попробуем помыслить широко, исходя из условий и задач заказчика.

Суть дела: юзеры накидывают события за разные даты вразнобой. Поэтому на каждую дату там рандомный набор айдишников.
После этого они задаются вопросом о том, чтобы восстановить хронологию событий по датам. Суть хронологии событий такова, что
порядок событий в рамках каждой даты определяется самим айдишником (чем больше айдишник, тем позже произошло событие в рамках этой даты). Поэтому, мы считаем, что событие с id=6 за 9 число произошло раньше, чем событие id=3 за 10число.

Возможно, здесь стоит задаться вопросом о том, как эффективно организовать такую таблицу и занесение данных в неё, чтобы потом легко ответить на вопросы: -какое событие является предыдущим, а какое - последующим? Ставить в отдельное поле таймстемп для событий смысла не имеет, т.к. это будет, по сути, дублем поля id, только цифр больше.

Пока мне это не понятно как организовать.

Отредактированно inmerdorm (09.08.2017 12:23:03)

Неактивен

 

#5 09.08.2017 15:13:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите составить запрос

А почему бы Вам не хранить время с точностью до секунды? timestamp/datetime в помощь. Так будет проще.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 09.08.2017 15:50:25

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: Помогите составить запрос

deadka написал:

А почему бы Вам не хранить время с точностью до секунды? timestamp/datetime в помощь. Так будет проще.

Дальше что?
очерёдность теймстемпов идентична очерёдности айдишников. Это не даёт ничего нового.

Неактивен

 

#7 09.08.2017 15:56:12

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Помогите составить запрос

>Я, имея некий id на руках, хочу получить "предыдущий". Ну, то есть, если я имею 3, то получить надо 6. Если 4, то 3.

Мы можем взять предыдущий запись, соответствующую предыдущему timestamp? Приведите набор данных с timestamp и результат, который хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 09.08.2017 16:06:34

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: Помогите составить запрос

deadka написал:

>Я, имея некий id на руках, хочу получить "предыдущий". Ну, то есть, если я имею 3, то получить надо 6. Если 4, то 3.
Мы можем взять предыдущий запись, соответствующую предыдущему timestamp?

Нет, т.к. это не будет соответствовать логике задачи.
http://i.imgur.com/UvwDiEp.png

Неактивен

 

#9 09.08.2017 22:21:26

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: Помогите составить запрос

Короче, я так понимаю, что просто нужно получить этот массив и в пхп далее изгаляться.

Неактивен

 

#10 10.08.2017 11:47:30

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Помогите составить запрос

Попробуйте для начала сформулировать алгоритм.

Отредактированно klow (10.08.2017 11:47:42)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson