Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2014, 03:42   #1
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
Смех

Всем добрый день. Занимаюсь разработкой веб-сайта, нужно составить sql запрос, собственно проблема в том что азы sql я знаю, но вот как реализировать нужное - увы не знаю...
Есть таблица:
| age | age_min | age_max | number
| 20 | 15 | 100 | 5
| 30 | 10 | 80 | 3
................................... ................................... ...

Нужно сгруппировать строки так чтобы number был одинаковым во всей группе, age ВСЕХ строк подходил под минимальные и максимальные значения ВСЕХ сток в группе.
Пример ответа:
10|27|90|3
25|30|80|3
25|26|50|3
01|34|40|3

Это только одна группа, по идее их может быть много.

Собственно говоря как это реализировать? Здесь как бы нужно сравнивать каждую строку с с другими... много строк с множеством строк.

Люди, если что-то непонятно вы скажите. Это довольно сложно обьяснить... Потому честно говоря начинаю задумываться реально ли такое сделать?
Это ещё не конец и даже не начало конца, это возможно только конец начала.

Последний раз редактировалось Stilet; 08.12.2014 в 07:32.
pufystyj вне форума Ответить с цитированием
Старый 08.12.2014, 07:21   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от pufystyj Посмотреть сообщение
age ВСЕХ строк подходил под минимальные и максимальные значения ВСЕХ сток в группе.
Пример ответа:
10|27|90|3
25|30|80|3
25|26|50|3
01|34|40|3
Противоречие у Вас, в указанных цифрах ни одна строка не имеет age внутри хотя бы собственных min-max не говоря уж о "группе", кстати, что Вы понимаете под группой ? складывается впечатление , что сортировку, а не группировку.

Написать глубокой ночью в несильно популярном разделе и через полчаса удивиться, что никто не ответил - молодцом!
phomm вне форума Ответить с цитированием
Старый 08.12.2014, 07:33   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Люди, если что-то непонятно вы скажите.
Я только проснулся, и мне вообще ничего не понятно.
Может лучше начни с того что расскажешь зачем тебе такое?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.12.2014, 08:31   #4
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Противоречие у Вас, в указанных цифрах ни одна строка не имеет age внутри хотя бы собственных min-max не говоря уж о "группе", кстати, что Вы понимаете под группой ? складывается впечатление , что сортировку, а не группировку.
Написать глубокой ночью в несильно популярном разделе и через полчаса удивиться, что никто не ответил - молодцом!
Эх уж эти предубеждения не ночью я писал, а где-то в 7 вечера, просто у нас разные временные пояса. И честно говоря я не ждал ответа так быстро, ибо знаю о разнице в времени. Но через некоторое время просто подумал что я мог плохо обьяснить свой вопрос и...
На счет несоответствия я очень сильно извиняюсь (100 раз проверял, но не посмотрел что я перепутал местами колонки). Собственно говоря, age и age_min в примере ответа нужно поменять местами. то есть:
27|10|90|3
30|25|80|3
26|25|50|3
34|01|40|3
Давайте я наведу реальный пример. Я пишу веб-сайт по поиску напарников для сетевых игр (ну например у вас есть желание поиграть quake 3, но не с кем). Понятное дело что человеку которому лет так 35, будет совсем не интересно *рубиться в кваку* с группой 10-летних школьников. Так вот, грубо говоря на сайте вы заполняете форму где указываете некоторые данные, среди этих данных есть ваш возраст, а также минимальный и максимальный возрасты ваших потенциальных напарников. Если система не находит напарника (а точнее группу напарников, кстати, колонка number - как раз указывает сколько людей нужно) то она добавляет ваш *запрос* в так званный стэк (который является таблицей в базе данных) и когда кто-то дугой заполняет форму система снова проверяет есть ли подходящее количество людей для уже новой формы, если есть - она извлекает нужные записи в форме и обрабатывает их, если нет - также добавляет форму в стэк.
В принципе здесь может быть и никакое группирование не нужно, просто надо найти записи которые сходятся между собой и проверить сходиться и количество с number.
оффтоп: Спасибо что так быстро отозвались, честно говоря я не знаю поняли ли Вы то что я написал, если нет - я подумаю как бы получше описать ситуацию и завтра утром вам изложу более понятную версию.
Так же я ни в коем случае не осуждаю вас за те *предубеждения* ибо знаю какие индивидуумы иногда на этот форум забредают. Хотя вполне вероятно что я один из таких, но с моей перспективы этого не видно...
Вообще мне бы стоило прочесть книгу по sql, но дело в том что мне пока по рельсам (Rails) хватает материала который нужно прочесть и читать целую книгу ради одного сложного запроса пока нет особого желания. Хотя само собой рано или поздно придется.
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 08.12.2014, 08:56   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну если твоя СУБД съест group by в подзапросе, и если правильно понял, то тогда примерно так
Код:
SELECT A.age_min,A.age,A.age_max,A.number
  FROM MyTable A,
    (SELECT number,MAX(age_min) AS age_min, MIN(age_max) AS age_max
       FROM MyTable
       GROUP BY number) U
  WHERE A.number=U.number AND A.age>=U.age_min AND A.age<=U.age_max
Цитата:
не осуждаю вас за те *предубеждения*
Какие предубеждения? Откуда форумчанам знать, что ТС за океаном живет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 08.12.2014 в 09:00.
Аватар вне форума Ответить с цитированием
Старый 08.12.2014, 09:37   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
что ТС за океаном живет?
как - "за океаном" ?!?!!

Цитата:
pufystyj
Участник клуба

Регистрация: 10.11.2010
Адрес: Украина
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.12.2014, 09:46   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как - "за океаном" ?!?!!
Да он вроде сам говорил что в Америке обитает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.12.2014, 09:51   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Украина же в Европу собиралась! Шо, уже до Америки доплыла?
Vapaamies вне форума Ответить с цитированием
Старый 08.12.2014, 22:04   #9
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

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

На счет кода:
Код:
SELECT A.age_min,A.age,A.age_max,A.number
  FROM MyTable A,
    (SELECT number,MAX(age_min) AS age_min, MIN(age_max) AS age_max
       FROM MyTable
       GROUP BY number) U
  WHERE A.number=U.number AND A.age>=U.age_min AND A.age<=U.age_max
Сначала я не понял, уже хотел спросить непонятное. Но потом до меня дошло, я за такой же логикой собирался сделать с помощью коллекций, если бы не смог написать запрос к бд. Спасибо большое, теперь можно продолжать. Через часик протестирую, но походу тему можно закрывать. Пойду гуглить книгу по sql, добавлю её в свой список.

Цитата:
Украина же в Европу собиралась! Шо, уже до Америки доплыла?
мы уехали раньше чем все это началось.

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

Последний раз редактировалось pufystyj; 08.12.2014 в 22:15.
pufystyj вне форума Ответить с цитированием
Старый 09.12.2014, 01:46   #10
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну если твоя СУБД съест group by в подзапросе, и если правильно понял, то тогда примерно так
Код:
SELECT A.age_min,A.age,A.age_max,A.number
  FROM MyTable A,
    (SELECT number,MAX(age_min) AS age_min, MIN(age_max) AS age_max
       FROM MyTable
       GROUP BY number) U
  WHERE A.number=U.number AND A.age>=U.age_min AND A.age<=U.age_max
Какие предубеждения? Откуда форумчанам знать, что ТС за океаном живет?
Да, все таки мои опасения оправдались. Чуть-чуть не так работает запрос. Попытаюсь обьяснить на примере:
Есть вот такие данные в бд:
age_min | age | age_max | number

10 | 20 | 50 | 3
15 | 16 | 21 | 3
0 | 22 | 100| 3
3 | 70 | 100 | 3
13 | 17 | 25 | 4
14 | 16 | 23 | 5

Дальше мы выполняет предоставленный вами запрос, но дело в том что он выбирает данные где возраст стоит между самым меньшим максимальным и самым большим минимальным из всех строк в номерной группе.
Вот ответ по запросу:
10 20 50 3
15 16 21 3
13 17 25 4
14 16 23 5

Но тут если откинуть строку *15 16 21 3*, тогда строки
0 | 22 | 100| 3
3 | 70 | 100 | 3

подойдут под
10 | 20 | 50 | 3

и тогда группа будет состоять из 3-х строк, как раз то количество что надо.

Собственно проблему можно озвучить как-то так:
Найти максимально большую группу строк в каждой нормерной группе (то есть сначала сгруппировать по number) в которых age'ы не выходят за минимальные и максимальные рамки любой строки в этой самой *максимально большой группе*. То есть не в целой группе с номером равным 3, а в её подгруппе.

Мне кажется что подобное нельзя в базе данных сделать, наверное придется доставать номерную группу из бд и уже ручками их группировать и все же, что скажут эксперты?
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложный запрос SQL irina1410 БД в Delphi 4 03.07.2012 16:46
сложный SQL update luiszevs SQL, базы данных 4 18.12.2011 13:53
Сложный запрос в SQL A-Lex-Is SQL, базы данных 1 10.08.2010 23:19
сложный sql запрос kate158 БД в Delphi 0 18.09.2008 11:38
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10