Сортировка и выборка меченых записей и +1 -1

$lider

Бывает
Сортировка и выборка меченых записей и +1 -1

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

p.s.
Например есть:
1
1 2
32
43
456
74
1 89
105
10
136
1 151
167
5
А нужно получить:
1
1 2
5
74
1 89
105
136
1 151
167
 

Фанат

oncle terrible
Команда форума
выбирай записи с флагом по алфавиту.
а +1 -1 будешь довыбирать потом
 

$lider

Бывает
Записи в таблице в хаотическом порядке.
При выборе по алфавиту и с флагом я получу id.
А строки +1 и -1 не будут соответствовать id+1 и id-1

-~{}~ 13.12.06 10:05:

Наверное я не совсем правельно объяснил.
Вот пример
http://letter.com.ua/temp/vibor.html
 

Фанат

oncle terrible
Команда форума
не надо думать, что задача твоя такая уникальная и ты первый в мире кто столкнулся с ней. и никто её не понимает.
С таким вопросом сюда ходят ровно раз в месяц, как на работу.

Пояснять ничего не нужно. попробуй лучше понять, что я тебе говорю.
Где ты увидел в моих словах, чтоя тебе предлагаю прибавлять +1 и -1 к id?

-~{}~ 13.12.06 11:18:

для того, чтобы получить ответ на свой вопрос, ты должен дать определение предшествующей и последующей записи.
пока оно существует только у тебя в голове и никак здесь не описано
 

$lider

Бывает
>> будешь довыбирать потом
Тоесть потом цикл стоить и второй сортировкой изкать +1 и -1?

-~{}~ 13.12.06 10:25:

Сортирую по алфавиту.
Кидаю во временную таблицу.
Нумерую по возрастанию.
Выбираю по флагу и id_с_флагом+1 и id_с_флагом-1

Так будет работать.
Но это малость туповато :)
 

$lider

Бывает
В этом случае я могу привязаться к id
И id предшествующее будет соответствовать id_с_флагом-1
Так как записи в таблице уже отсортированы по алфавиту и пронуменованы по возрастанию.

Описал как я это знаю.
Хочу узнать как это сделать правельно.
 

Фанат

oncle terrible
Команда форума
что означает флаг.
что за записи ты выбираешь, и для чего
что означают записи +1 и -1
 

$lider

Бывает
Автор оригинала: Фанат
что означает флаг.
что за записи ты выбираешь, и для чего
что означают записи +1 и -1
id -- text -- on

id - Уникальный номер.
text - Строка с текстом, расположеная в таблице НЕ по алфавиту.
on - Флаг, метка для записей. В даннм случае 1.

Хочу проверить на повторяющиеся записи. НО! Они не обязательно идеинтичны! text может отличаться 2,3 и т.д. словом, 12, 15 и т.д. буквой. Тоесть записи не абсолютно одинаковы. Вот хочу сделать выборку, что бы не листать в Excel по алфавиту все 25 тыс. записей, а выбрать имено с on=1 и окололежащие по алфавиту (во блин) записи.
 

A-Lex[FM]

Web/Highload/DataScience
SELECT * FROM table WHERE id>id_s_flagom LIMIT 1
SELECT * FROM table WHERE id<id_s_flagom LIMIT 1

или я в чём то не прав?
 

$lider

Бывает
Автор оригинала: Фанат
oh mein gottt!!!
несите мне валерьянки!
Повторяющиеся просто слово.
Вот две записи.

Без беды друга не узнаешь.
Без трагедии не познаешь товрища.

Они разные, но в моем случае они ОДИНАКОВЫЕ!
И машине это не объяснить.
Нужно выбрать и просматривать самому!

-~{}~ 13.12.06 11:52:

Автор оригинала: A-Lex[FM]
SELECT * FROM table WHERE id>id_s_flagom LIMIT 1
SELECT * FROM table WHERE id<id_s_flagom LIMIT 1

или я в чём то не прав?
Так не будет по алфавиту :(
 

A-Lex[FM]

Web/Highload/DataScience
Это запросы для выбора двух соседних строк. В общем случае твоя задача решается примерно так.
SELECT * FROM table WHERE flag=1 ORDER BY {то что тебе надо}
Затем в цикле перебирай эти записи и для каждой делай два запроса, постепенно расшия результирующий массив.
типа
while ($row = mysql_fetch_assoc($result)) {
$array[] = mysql_fetch_assoc(mysql_query("SELECT * FROM table WHERE id<".$row['id']." LIMIT 1"));
$array[] = $row;
$array[] = mysql_fetch_assoc(mysql_query("SELECT * FROM table WHERE id>".$row['id']." LIMIT 1"));
}

В итоге в массиве $array[] получишь свой нужный результат. Если что-то непонятно, RTFM
 

$lider

Бывает
to A-Lex[FM]

Задумка понятна.
Можно через масивы.
Вывирать, сортировать, перенумеровывать, а потом из масива выводить.

p.s. данная выборка нужного мне не дает... ;)
особенно здесь
... WHERE id<".$row['id']." ...
может так WHERE id=".$row['id']-1." ;)
 

$lider

Бывает
Так они и идут не по порядку...
При таком запросе и $row['id']=154 (например), результат будет строка с id = 1. Это ведь меньше $row['id']

$array[] = mysql_fetch_assoc(mysql_query("SELECT * FROM table WHERE id<".$row['id']." LIMIT 1"));
 

Invizz

Новичок
Можно выбрать три записи одним запросом:

Допустим, есть id = 9:
[sql]SELECT * FROM table WHERE id<11 ORDER BY id DESC LIMIT 3 [/sql]
Вернет 3 записи
1я - 10 (+1)
2я - 9 (искомая)
3я - 8 (-1)
 

botan

Новичок
да. нехватает в mysql аналитических функций.
Если извращаться, то можешь сделать insert select в другую таблицу упорядочив по алфавиту.
insert into sometable2 select * sometable1 order by sometextx и удаляй себе смысловые дубли на здоровье.

А так, можно конечно поизвращаться... (для краткости предположим что таблица уже упорядочена).
select
id,
sometext,
(select max(id) from sometable2 t1 where t1.id<t_main_id) prev_id,
(select min(id) from sometable2 t1 where t1.id>t_main_id) next_id
from
sometable2 t_main.
 
Сверху