Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите составить запрос, Составить запрос 
:(
    Опции темы
Kizja
Дата 2.11.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Здрасте, помогите пожалуйста составить запрос:
допустим есть таблица в которой 2 колонки: 
1. id - он же primary key и 2. number - какое-нибудь число.

И допустим у нас 10 записей:
id number
 1   100
 2   300
 3   500
 4   500
 5   300
 6   100
 7   300
 8   300
 9   100
10  100

Задача в том, чтобы из этого получить записи с номерами: 
id number
 1   100
 2   300
 3   500
 5   300
 6   100
 7   300
 9   100

Т.е. другими словами надо выкинуть из запроса те, у которых number равен number в следующей записи.
PM MAIL   Вверх
Fin
Дата 2.11.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Цитата
 
Т.е. другими словами надо выкинуть из запроса те, у которых number равен number в следующей записи. 

Судя по этой логике, не должна попасть в таблицу записи с id = 3, 7, 9. Но у тебя в таблице они присутствуют.

Примерно запрос должен выглядеть так. 
Код

select id as qid, Num 
from prob 
where Num != (select Num from prob where id = qid+1)

Точно определи условия задачи. И корректируй соответственно запрос.


Это сообщение отредактировал(а) Fin - 2.11.2007, 23:53


--------------------
Пролетал мимо.
PM MAIL   Вверх
Kizja
Дата 3.11.2007, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Fin,
спасибо за ответ, я немного изменил твой пример и получилось такое:
Код

select id as qid, Num 
from prob 
where 
Num != (select Num from prob where id = qid-1) 
or qid = (select min(id) from prob);


Т.е. чтобы он про первый элемент бы тоже не забыл, но вот проблема в том, что если используется условие: "id = qid-1" и поскольку нету всё же гарантии, что id будут обязательно по порядку, увеличиваясь на 1, то эта конструкция может дать сбой. Может есть какой-то вариант понадёжнее?
PM MAIL   Вверх
Akina
Дата 3.11.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Бред, бред и еще раз бред. Не существует порядка записей, пока не указана сортировка. Неужели ты думаешь, что если ты сделаешь из первичной таблицы выборку select * from table, то всегда в результирующем наборе записи будут располагаться в порядке возрастания значений ID? Щазз! Так что задача твоя... ладно, скажу политкорректно - не до конца сформулирована.

Цитата(Kizja @  3.11.2007,  02:48 Найти цитируемый пост)
 нету всё же гарантии, что id будут обязательно по порядку, увеличиваясь на 1

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Kizja
Дата 3.11.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Хорошо, если предположить, что в таблице так же есть колонка time, то можно ли тогда реализовать эту задачу? – т.е. упорядочив по времени чтобы не было бы подряд двух одинаковых значений в колонке Num – если данный Num равен предыдущему, то не берётся.
PM MAIL   Вверх
Akina
Дата 3.11.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Kizja @  3.11.2007,  17:45 Найти цитируемый пост)
если предположить, что в таблице так же есть колонка time, то можно ли тогда реализовать эту задачу?

Конечно можно. Причем не очень сложно. Объясню на словах родственную задачу.

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

Единственный недостаток такого подхода - не будет строки, в которой в первой копии находятся данные самой последней записи. Однако легкая модификация ОПИСАННОГО способа получения данных позволит легко устранить эту проблемку.

Удачи!


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.