SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 03.09.2010 17:09:49

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Вычисление соседних id

Здравствуйте! Возникла необходимость вычисления соседних id у вытаскиваемой записи из таблицы.
Например, есть таблица table и в ней 100 записей. Пусть к примеру содержимое столбца id идет в таком порядке: 15, 18, 29, 31... Я вытаскиваю запись с id 18. Собсвенно вопрос, как мне вытащить соседние к нему записи с id 15 и 29?

Неактивен

 

#2 03.09.2010 17:51:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вычисление соседних id

SELECT id FROM tablename WHERE id < 18 ORDER BY id DESC LIMIT 1;
и аналогично второе.

Неактивен

 

#3 03.09.2010 17:56:56

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Вычисление соседних id

т.е. по любому придется делать два запроса? За один не получится вытащить оба id?

Неактивен

 

#4 03.09.2010 18:03:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вычисление соседних id

А зачем? smile

Неактивен

 

#5 03.09.2010 18:15:24

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Вычисление соседних id

Ну просто чем меньше запросов, тем лучше мне кажется smile Но все равно спасибо за помощь!

Неактивен

 

#6 03.09.2010 18:45:49

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Вычисление соседних id

можно вот так сделать, когда вы только вытаскиваете саму запись:

SELECT
t1.id
, (SELECT id FROM tbl WHERE id < t1.id ORDER BY id DESC LIMIT 1) as prev_id
, (SELECT id FROM tbl WHERE id > t1.id ORDER BY id ASC LIMIT 1) as next_id
FROM tbl t1
WHERE
 t1.id = 18 {или какое у вас там условие}
 

Отредактированно Shopen (03.09.2010 18:46:41)

Неактивен

 

#7 03.09.2010 20:30:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вычисление соседних id

Но учтите, что это те же три запроса wink

Неактивен

 

#8 03.09.2010 21:57:03

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Вычисление соседних id

Ну может у него сервер удаленный smile
Сэкономит на подключении и анализаторе.

Неактивен

 

#9 04.09.2010 00:20:03

Garik
Завсегдатай
Зарегистрирован: 26.05.2010
Сообщений: 27

Re: Вычисление соседних id

ок, спасибо за ответы! Попробую

Неактивен

 

#10 04.09.2010 10:56:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вычисление соседних id

Нет, просто люди почему-то считают, что один запрос выполняется быстрее,
чем два. Причем не понятно, откуда следует это заблуждение sad

Особенно не понятно, потому что как правило они объединяют разную по
смыслу информацию, а потом пытаются разделить ее из одного dataset внутри
клиентского приложения.

Неактивен

 

#11 04.09.2010 15:11:04

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Вычисление соседних id

Заблуждение идет из другой крайности. Сначала начинают фигачить запросы где не попадя, вытаскивать записи внутри циклов, вместо джойнов вынимать данные из двух, трех... n таблиц скриптом. Потом это начинает тормозить, потом начинают читать, и тут опа, обнаруживается, что все потому что много запросов. Появляется новый абсолют - сократить их до минимума. Обычно это оправдано, но если мозг отключить - то превращается в догму smile


В данном случае лично я бы одним запросом (который написал) и сделал, потому что если записей вынимается не одна, а 30 например, то он вытащит нужные данные сразу, иначе придется бежать где то циклом и довытаскивать эти prev_id и next_id.

Неактивен

 

#12 04.09.2010 16:04:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вычисление соседних id

Подозреваю, что человеку таки нужно просто показывать текущий товар
и выдавать ссылки на непосредственных соседей smile

Неактивен

 

Board footer

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