|
|
|
| Всем привет!
Есть задача, надо вытащить одним запросом, три записи из таблицы!
То есть, есть таблица: 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 | |
|
|
|
|
|
|
|
для: Diablo_
(27.07.2009 в 15:41)
| | а чем у Вас обусловлена выборка по id?
т.е почему нужно выбрать именно эти записи? | |
|
|
|
|
|
|
|
для: Diablo_
(27.07.2009 в 15:41)
| | нужно просто добавить order by и limit:
SELECT `id`, `name`, `date` FROM `table` WHERE `id` = $id order by id limit 3;
|
| |
|
|
|
|
|
|
|
для: Diablo_
(27.07.2009 в 15:41)
| | ой, я не заметил, что один айди должен быть меньшим | |
|
|
|
|
|
|
|
для: ride
(27.07.2009 в 15:59)
| | id - нужен лишь для обеспечения уникальности строки. Выборка просто по id не имеет (не должна иметь, при правильной организации таблицы) смысла.
Отсюда и последствия с вытекающим геморроем. | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 16:10)
| | что-то я не совсем уловил вашу мысль.
>>Выборка просто по id не имеет (не должна иметь, при правильной организации таблицы) смысла.
это как?
//по-моему очень даже часто встречающийся запрос.
select `field` from `table` where id=$id
|
| |
|
|
|
|
|
|
|
для: ride
(27.07.2009 в 16:23)
| | как видите здесь id чётко задан и я на 100% уверен, что он зарание известен и обусловлен:
1) последней определённой вставленной строкой (перед этим нужно её ещё и постараться вставить эту строку)
2) идентификатором определённой строки переданной, к примеру, ГЕТ или ПОСТ запросом из браузера (перед формированием ссылки содержащей этот id была выборка, к примеру, по темам (но не по id) форума)
3) и т.д. заранее определённой строки.
в данном случае заранее известен только один id | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 16:35)
| | я в танке.
возможно, вы имеете ввиду запрос типа
select id from table where id=$id
|
то есть, если выбирается только поле айди по уже известному айди? | |
|
|
|
|
|
|
|
для: ride
(27.07.2009 в 16:46)
| | Вы хоть сами поняли ЧТО написали?:) | |
|
|
|
|
|
|
|
для: 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;
|
Хоть в этот раз я вас правильно понял? | |
|
|
|
|
|
|
|
для: ride
(27.07.2009 в 16:56)
| | нет, я говорю абсолютно о другом
вашу ошибку я не видел, потому что даже не смотрел ваш запрос
последний запрос имеет право на жизнь если id кроме уникальности строки ещё и выполняет функции порядкового номера (это очень специфическая таблица с кучей ограничений право на существование которой, ещё нужно доказать), чего в подавляющем большинстве (читай совсем) случаев быть не должно. | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 17:10)
| | пойду почитаю самоучитель | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 17:10)
| | может вам не понравилось то, что идет выборка по id, а не по, например date? | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 16:10)
| | id - обычно имеет примари кэй.. и как раз нужно, чтоб выборка шла именно по этому полю..
допустим, имея логин и id юзера вы по какому полю будете делать выборку?
по id... | |
|
|
|
|
|
|
|
для: а-я
(27.07.2009 в 17:05)
| | каким местом 31 слово написанное вами имеет отношение к теме разговора?
неужели я так непонятно излогаю? помоему расписал уж дальше некуда... | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 17:32)
| | эт реакция на Ваш пост "Выборка просто по id не имеет (не должна иметь, при правильной организации таблицы) смысла."
Из этого я понял, что нет смысла делать выборку по id т.к. не получу того что мне надо...
может Вы хотели сказать, что id не должно нести смысл по отношению к данным, а лишь для их связи данных в таблице(ах)? | |
|
|
|
|
|
|
|
для: а-я
(27.07.2009 в 17:43)
| | я хотел, хочу и всегда буду хотеть сказать что id - то уникальный идентификатор строки (даже в пределах одной таблицы) и не более того.
зная только один определённый id (и то что находиться в этой строке) вы не можете знать ничего о содержимом строки id+1, а только лишь то что это другая строка.
В противнеом случае у вас неправильно организована база и вы слыхом не слышали об уровнях нормализации. | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 17:32)
| | В MySQL свойство автоинкрементного первичного ключа образовывать возрастающую последовательность может быть использовано для выборок упорядоченных по этому ключу наборов строк.
Заметьте, я не сказал - непрерывную. Просто возрастающую.
Обычно такое ограничение на первичный ключ сильно неприятных побочных эффектов не приносит. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 17:47)
| | ну это же совсем другая история
принимая во внимание то что Вы сказали перефразирую немного сам себя
зная только один определённый id (и то что находиться в этой строке) вы не можете знать ничего о содержимом строки id+1, а только лишь то что это другая строка и создана она позже строки id при условии автоинкремента. | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:02)
| | Это не так.
Зная только один определённый id о содержимом строки id+1 мы ничего предполагать не можем (равно как и о id-1) .
Но зная значения двух id , мы можем предполагать, что строка с меньшим из них была добавлена в таблицу раньше, чем строка с большим.
Если, конечно, добавление строки всегда выполняется с применением механизма auto_increment | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 18:17)
| | разве я не так сказал? id+1 это и есть строка с большим идентификатором | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:29)
| | Если учесть, что задача топикстартера была именно "найти три ближайших(по возрастанию) айди", то мой запрос вполне удовлетворяет условию.
причем тут вся эта лекция? | |
|
|
|
|
|
|
|
для: ride
(27.07.2009 в 18:41)
| | 1 ближайший по убыванию и 1 ближайший по возрастанию | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:45)
| | автор: ride (27.07.2009 в 15:59) письмо автору
для: Diablo_ (27.07.2009 в 15:41)
ой, я не заметил, что один айди должен быть меньшим | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:29)
| | не так. id+1 Это строка с идентификатором равным id плюс единица ровно. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 18:44)
| | чисто гипотетически +1 это всего лишь указание на то что эта строка соответствует условию id+1>id, но даже если плюс единица ровно то что это меняет?
Принимая во внимание, что Вы редко ошибаетесь, хочу понять в чём в данном случае ошибаюсь я :) | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:49)
| | В том, что строка id+1 может отсутствовать. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 18:50)
| | даже если удалить эту строку сразу после её занесения в базу, она просуществует несколько сотых / тысячных секунды, если конечно вставка имела место быть, чего я не стану утверждать дабы не давать повода для дальнейшей дискуссии, хотя и и не против потрындеть.
Эх.. надо было -1 приводить примером, её тоже может не быть, но о том что её не существовало в природе речь бы уже не шла :) | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:58)
| | если автоикремент 1
____
чую шизофрения не за горами :) | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 18:58)
| | >даже если удалить эту строку сразу после её занесения в базу, она просуществует несколько сотых /
1. А какая разница, сразу или нет будет удалена строка и сколько времени она просуществует?
2. А вокруг id из середины дырки существовать не могут чтоли? | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 19:03)
| | А какая разница, сразу или нет будет удалена строка и сколько времени она просуществует
мы ничего не говорили о времени выборки
А вокруг id из середины дырки существовать не могут чтоли?
могут, ответ тот же самый.
я полагал что id+1 существует, по умолчанию, как ровно и то что Вы не обмолвились что первый id и второй id относятся к одной таблице ;) | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 19:12)
| | >я полагал что id+1 существует,
Да с чего вдруг?
Его могли удалить двадцать раз.
UPD. Нет. не двадцать. Только один. Но один - за милую душу. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 19:13)
| | но могли и не удалить
___
я полагал, а не предполагал как условие (условие задания... моё условие), а не как догадки. | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 19:24)
| | то есть функцию порядкового номера навязали ситуации именно Вы?
Тогда вообще несяно зачем - уж коль скоро она Вам не импонирует. | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 19:35)
| | где я навязал?
даже если id полностью совпадает с порядковым номером строки, для меня id - только идентификатор. | |
|
|
|
|
|
|
|
для: Valick
(27.07.2009 в 20:10)
| | Дроп | |
|
|
|
|
|
|
|
для: Trianon
(27.07.2009 в 20:41)
| | id+n>id, где id+n принадлежит множеству ID при условии автоинкремента.
так норм? :) | |
|
|
|
|
|
|
|
для: Valick
(28.07.2009 в 07:19)
| | зная только один определённый id1 (и то что находиться в этой строке) вы не можете знать ничего о содержимом строки id2 (id2> id1), а только лишь то что id2 - это другая строка и создана она позже строки id1 при условии, что строки в таблице получают ключи посредством механизма автоинкремента.
так, полагаю, сойдемся. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|