Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Одним запросом три записи!
 
 автор: Diablo_   (27.07.2009 в 15:41)   письмо автору
 
 

Всем привет!
Есть задача, надо вытащить одним запросом, три записи из таблицы!
То есть, есть таблица: table
в ней, есть три полян! id, name, date.
Значение id может быть не по порядку! Например: 1,67,190,211, 212,321,324,328..........
Я вытаскиваю запись, запросом селект
SELECT `id`, `name`, `date` FROM `table` WHERE `id` = $id;
$id = 321
Ну я получаю запись с номером 321!
И вот вопрос, как мне вытащить две ближайщие (боковые) записи???
то есть получить записи
212
321
324

  Ответить  
 
 автор: Valick   (27.07.2009 в 15:54)   письмо автору
 
   для: Diablo_   (27.07.2009 в 15:41)
 

а чем у Вас обусловлена выборка по id?
т.е почему нужно выбрать именно эти записи?

  Ответить  
 
 автор: ride   (27.07.2009 в 15:59)   письмо автору
 
   для: Diablo_   (27.07.2009 в 15:41)
 

нужно просто добавить order by и limit:
SELECT `id`, `name`, `date` FROM `table` WHERE `id` = $id order by id limit 3;

  Ответить  
 
 автор: ride   (27.07.2009 в 15:59)   письмо автору
 
   для: Diablo_   (27.07.2009 в 15:41)
 

ой, я не заметил, что один айди должен быть меньшим

  Ответить  
 
 автор: Valick   (27.07.2009 в 16:10)   письмо автору
 
   для: ride   (27.07.2009 в 15:59)
 

id - нужен лишь для обеспечения уникальности строки. Выборка просто по id не имеет (не должна иметь, при правильной организации таблицы) смысла.
Отсюда и последствия с вытекающим геморроем.

  Ответить  
 
 автор: ride   (27.07.2009 в 16:23)   письмо автору
 
   для: Valick   (27.07.2009 в 16:10)
 

что-то я не совсем уловил вашу мысль.
>>Выборка просто по id не имеет (не должна иметь, при правильной организации таблицы) смысла.
это как?


//по-моему очень даже часто встречающийся запрос. 
select `field` from `table` where id=$id

  Ответить  
 
 автор: Valick   (27.07.2009 в 16:35)   письмо автору
 
   для: ride   (27.07.2009 в 16:23)
 

как видите здесь id чётко задан и я на 100% уверен, что он зарание известен и обусловлен:
1) последней определённой вставленной строкой (перед этим нужно её ещё и постараться вставить эту строку)
2) идентификатором определённой строки переданной, к примеру, ГЕТ или ПОСТ запросом из браузера (перед формированием ссылки содержащей этот id была выборка, к примеру, по темам (но не по id) форума)
3) и т.д. заранее определённой строки.

в данном случае заранее известен только один id

  Ответить  
 
 автор: ride   (27.07.2009 в 16:46)   письмо автору
 
   для: Valick   (27.07.2009 в 16:35)
 

я в танке.
возможно, вы имеете ввиду запрос типа
select id from table where id=$id

то есть, если выбирается только поле айди по уже известному айди?

  Ответить  
 
 автор: Valick   (27.07.2009 в 16:49)   письмо автору
 
   для: ride   (27.07.2009 в 16:46)
 

Вы хоть сами поняли ЧТО написали?:)

  Ответить  
 
 автор: ride   (27.07.2009 в 16:56)   письмо автору
 
   для: Valick   (27.07.2009 в 16:49)
 

перечитав всю историю нашей с вами беседы, меня озарила мысль, что вы говорите о запросе
SELECT `id`, `name`, `date` FROM `table` WHERE `id` = $id order by id limit 3;

если так, то конечно же, я имел ввиду не `id` = $id, а `id` > $id
то есть, я имел ввиду запрос
SELECT `id`, `name`, `date` FROM `table` WHERE `id` > $id order by id limit 3;

Хоть в этот раз я вас правильно понял?

  Ответить  
 
 автор: Valick   (27.07.2009 в 17:10)   письмо автору
 
   для: ride   (27.07.2009 в 16:56)
 

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

  Ответить  
 
 автор: ride   (27.07.2009 в 17:17)   письмо автору
 
   для: Valick   (27.07.2009 в 17:10)
 

пойду почитаю самоучитель

  Ответить  
 
 автор: ride   (27.07.2009 в 17:51)   письмо автору
 
   для: Valick   (27.07.2009 в 17:10)
 

может вам не понравилось то, что идет выборка по id, а не по, например date?

  Ответить  
 
 автор: а-я   (27.07.2009 в 17:05)   письмо автору
 
   для: Valick   (27.07.2009 в 16:10)
 

id - обычно имеет примари кэй.. и как раз нужно, чтоб выборка шла именно по этому полю..

допустим, имея логин и id юзера вы по какому полю будете делать выборку?
по id...

  Ответить  
 
 автор: Valick   (27.07.2009 в 17:32)   письмо автору
 
   для: а-я   (27.07.2009 в 17:05)
 

каким местом 31 слово написанное вами имеет отношение к теме разговора?

неужели я так непонятно излогаю? помоему расписал уж дальше некуда...

  Ответить  
 
 автор: а-я   (27.07.2009 в 17:43)   письмо автору
 
   для: Valick   (27.07.2009 в 17:32)
 

эт реакция на Ваш пост "Выборка просто по id не имеет (не должна иметь, при правильной организации таблицы) смысла."

Из этого я понял, что нет смысла делать выборку по id т.к. не получу того что мне надо...

может Вы хотели сказать, что id не должно нести смысл по отношению к данным, а лишь для их связи данных в таблице(ах)?

  Ответить  
 
 автор: Valick   (27.07.2009 в 18:01)   письмо автору
 
   для: а-я   (27.07.2009 в 17:43)
 

я хотел, хочу и всегда буду хотеть сказать что id - то уникальный идентификатор строки (даже в пределах одной таблицы) и не более того.
зная только один определённый id (и то что находиться в этой строке) вы не можете знать ничего о содержимом строки id+1, а только лишь то что это другая строка.
В противнеом случае у вас неправильно организована база и вы слыхом не слышали об уровнях нормализации.

  Ответить  
 
 автор: Trianon   (27.07.2009 в 17:47)   письмо автору
 
   для: Valick   (27.07.2009 в 17:32)
 

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

  Ответить  
 
 автор: Valick   (27.07.2009 в 18:02)   письмо автору
 
   для: Trianon   (27.07.2009 в 17:47)
 

ну это же совсем другая история
принимая во внимание то что Вы сказали перефразирую немного сам себя
зная только один определённый id (и то что находиться в этой строке) вы не можете знать ничего о содержимом строки id+1, а только лишь то что это другая строка и создана она позже строки id при условии автоинкремента.

  Ответить  
 
 автор: Trianon   (27.07.2009 в 18:17)   письмо автору
 
   для: Valick   (27.07.2009 в 18:02)
 

Это не так.
Зная только один определённый id о содержимом строки id+1 мы ничего предполагать не можем (равно как и о id-1) .
Но зная значения двух id , мы можем предполагать, что строка с меньшим из них была добавлена в таблицу раньше, чем строка с большим.
Если, конечно, добавление строки всегда выполняется с применением механизма auto_increment

  Ответить  
 
 автор: Valick   (27.07.2009 в 18:29)   письмо автору
 
   для: Trianon   (27.07.2009 в 18:17)
 

разве я не так сказал? id+1 это и есть строка с большим идентификатором

  Ответить  
 
 автор: ride   (27.07.2009 в 18:41)   письмо автору
 
   для: Valick   (27.07.2009 в 18:29)
 

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

  Ответить  
 
 автор: Valick   (27.07.2009 в 18:45)   письмо автору
 
   для: ride   (27.07.2009 в 18:41)
 

1 ближайший по убыванию и 1 ближайший по возрастанию

  Ответить  
 
 автор: ride   (27.07.2009 в 18:52)   письмо автору
 
   для: Valick   (27.07.2009 в 18:45)
 

автор: ride (27.07.2009 в 15:59) письмо автору
для: Diablo_ (27.07.2009 в 15:41)
ой, я не заметил, что один айди должен быть меньшим

  Ответить  
 
 автор: Trianon   (27.07.2009 в 18:44)   письмо автору
 
   для: Valick   (27.07.2009 в 18:29)
 

не так. id+1 Это строка с идентификатором равным id плюс единица ровно.

  Ответить  
 
 автор: Valick   (27.07.2009 в 18:49)   письмо автору
 
   для: Trianon   (27.07.2009 в 18:44)
 

чисто гипотетически +1 это всего лишь указание на то что эта строка соответствует условию id+1>id, но даже если плюс единица ровно то что это меняет?
Принимая во внимание, что Вы редко ошибаетесь, хочу понять в чём в данном случае ошибаюсь я :)

  Ответить  
 
 автор: Trianon   (27.07.2009 в 18:50)   письмо автору
 
   для: Valick   (27.07.2009 в 18:49)
 

В том, что строка id+1 может отсутствовать.

  Ответить  
 
 автор: Valick   (27.07.2009 в 18:58)   письмо автору
 
   для: Trianon   (27.07.2009 в 18:50)
 

даже если удалить эту строку сразу после её занесения в базу, она просуществует несколько сотых / тысячных секунды, если конечно вставка имела место быть, чего я не стану утверждать дабы не давать повода для дальнейшей дискуссии, хотя и и не против потрындеть.
Эх.. надо было -1 приводить примером, её тоже может не быть, но о том что её не существовало в природе речь бы уже не шла :)

  Ответить  
 
 автор: Valick   (27.07.2009 в 19:00)   письмо автору
 
   для: Valick   (27.07.2009 в 18:58)
 

если автоикремент 1
____
чую шизофрения не за горами :)

  Ответить  
 
 автор: Trianon   (27.07.2009 в 19:03)   письмо автору
 
   для: Valick   (27.07.2009 в 18:58)
 

>даже если удалить эту строку сразу после её занесения в базу, она просуществует несколько сотых /

1. А какая разница, сразу или нет будет удалена строка и сколько времени она просуществует?

2. А вокруг id из середины дырки существовать не могут чтоли?

  Ответить  
 
 автор: Valick   (27.07.2009 в 19:12)   письмо автору
 
   для: Trianon   (27.07.2009 в 19:03)
 

А какая разница, сразу или нет будет удалена строка и сколько времени она просуществует
мы ничего не говорили о времени выборки
А вокруг id из середины дырки существовать не могут чтоли?
могут, ответ тот же самый.
я полагал что id+1 существует, по умолчанию, как ровно и то что Вы не обмолвились что первый id и второй id относятся к одной таблице ;)

  Ответить  
 
 автор: Trianon   (27.07.2009 в 19:13)   письмо автору
 
   для: Valick   (27.07.2009 в 19:12)
 

>я полагал что id+1 существует,

Да с чего вдруг?
Его могли удалить двадцать раз.
UPD. Нет. не двадцать. Только один. Но один - за милую душу.

  Ответить  
 
 автор: Valick   (27.07.2009 в 19:24)   письмо автору
 
   для: Trianon   (27.07.2009 в 19:13)
 

но могли и не удалить
___
я полагал, а не предполагал как условие (условие задания... моё условие), а не как догадки.

  Ответить  
 
 автор: Trianon   (27.07.2009 в 19:35)   письмо автору
 
   для: Valick   (27.07.2009 в 19:24)
 

то есть функцию порядкового номера навязали ситуации именно Вы?
Тогда вообще несяно зачем - уж коль скоро она Вам не импонирует.

  Ответить  
 
 автор: Valick   (27.07.2009 в 20:10)   письмо автору
 
   для: Trianon   (27.07.2009 в 19:35)
 

где я навязал?
даже если id полностью совпадает с порядковым номером строки, для меня id - только идентификатор.

  Ответить  
 
 автор: Trianon   (27.07.2009 в 20:41)   письмо автору
 
   для: Valick   (27.07.2009 в 20:10)
 

Дроп

  Ответить  
 
 автор: Valick   (28.07.2009 в 07:19)   письмо автору
 
   для: Trianon   (27.07.2009 в 20:41)
 

id+n>id, где id+n принадлежит множеству ID при условии автоинкремента.
так норм? :)

  Ответить  
 
 автор: Trianon   (28.07.2009 в 07:33)   письмо автору
 
   для: Valick   (28.07.2009 в 07:19)
 

зная только один определённый id1 (и то что находиться в этой строке) вы не можете знать ничего о содержимом строки id2 (id2> id1), а только лишь то что id2 - это другая строка и создана она позже строки id1 при условии, что строки в таблице получают ключи посредством механизма автоинкремента.
так, полагаю, сойдемся.

  Ответить  
 
 автор: а-я   (27.07.2009 в 16:11)   письмо автору
 
   для: Diablo_   (27.07.2009 в 15:41)
 

хммм.. может что-то в этом роде...


$id = 321

SELECT 
 `id`, 
 `name`, 
 `date` 
FROM 
 `table` 
WHERE 
 `id` >= (
        SELECT 
         `id`
        FROM 
         `table`
        WHERE
         `id` < $id 
        ORDER BY `id` DESC 
        LIMIT 1
        )
ORDER BY `id`
LIMIT 3

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования