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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2011, 23:12   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,386
По умолчанию POSTGRE: выборка данных соотв. значению из той же таблицы

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

Пока есть такой код:

Код:
SELECT t_code, first_name, second_name,  t_group (для проверки)

FROM "Student"


HAVING t_group = (SELECT t_group, COUNT (t_group)
				FROM "Student"
				GROUP BY t_group

				ORDER 2 DESC LIMIT 1)
Но он не работает - пишет среда, что во вложенном подзапросе должен быть только один аргумент.

Как бы выкрутиться похитрее и вывести имена студентов самой многочисленной группы. Я понимаю, что запрос простенький, но уже фантазии не хватает - целый вечер с ним сижу.
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Blondy; 27.10.2011 в 23:15.
Blondy вне форума Ответить с цитированием
Старый 27.10.2011, 23:28   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а попробуйте так (хотя не все СУБД поддерживают подзапросы во FROM):
Код:
SELECT t_code, first_name, second_name,  t_group (для проверки)
FROM "Student", (SELECT t_group as t_group_max, COUNT (t_group) as cnt FROM "Student"
GROUP BY t_group
ORDER 2 DESC LIMIT 1) GR_MAX
where t_group = GR_MAX.t_group_max
если не пойдёт, то можно попробовать с двумя вложенными подзапросами:
Код:
SELECT t_code, first_name, second_name,  t_group (для проверки)
FROM "Student"
where t_group in (select t_group from (SELECT t_group as t_group_max, COUNT (t_group) as cnt FROM "Student"
GROUP BY t_group
ORDER 2 DESC LIMIT 1))

Последний раз редактировалось Serge_Bliznykov; 27.10.2011 в 23:30.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.10.2011, 23:36   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,386
По умолчанию

Какой, Сережа, Вы хитрый!))) "Слон" все скушал и не подавился)))

Я сейчас сформулирую вопросы к этому коду и попрошу Вас на них ответить.

У меня тоже была идея с псевдонимами для таблиц, но на все мои попытки написать код с псевдонимами, меня среда отправляла погулять))

PS Вы первый человек, о котором я подумала - вот Сережа бы в раз решил эту проблему)))) А Вы ну прямо как принц из сказки появились в самый необходимый момент)))

То есть получается, Сережа, что мы псевдонимы можем давать не только таблицам, но и неким выборкам из них - типа как переменным в серьезном программировании? Если честно для меня это новость - Вы мне открыли глаза на мир))))

Кстати, а если таких групп несколько - вот в этой группе получилось 4 человека, а ведь у меня есть другая группа, где тоже 4 человек учатся. А ведь LIMIT 1 выводит только первую строчку, а вторая группа типа не при делах. Интересно, мы можем использовать не LIMIT 1, а MAX, если выводимые данные (название группы) - символьные?
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Stilet; 30.10.2011 в 11:27.
Blondy вне форума Ответить с цитированием
Старый 28.10.2011, 00:49   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Сергей наверно бай-бай отправился Это для нескольких групп с одинаковым MAX кол-ва студентов
Код:
SELECT t_code, first_name, second_name, t_group
  FROM "Student",
       (SELECT t_group,COUNT(t_group) AS cnt FROM "Student" GROUP BY t_group) AS Gr1,
       (SELECT t_group,COUNT(t_group) AS cnt FROM "Student" GROUP BY t_group ORDER 2 DESC LIMIT 1) AS Gr2
  WHERE t_group=Gr1.t_group AND Gr1.cnt=Gr2.cnt
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2011, 01:39   #5
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,386
По умолчанию

О, дорогой Аватар, вы мужественный Птиц!!!!)) Фиг бы я сама до такого додумалась. Я сейчас тестить не буду - я тоже спать, завтра, вернее сегодня утро начинается в 6))

Ну вот почему у меня в голове совсем другие концепции крутятся. В теории написано - что если мы используем конструкцию подзапроса where .... in (), то для более точной выборки мы можем использовать конструкцию where ... all (), и он нам как раз выведет из подзапроса все группы, где количество студентов максимально и количество студентов в них равно максимальному значению. Я видно как-то не так поняла этот оператор - как логическое "и".
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 28.10.2011, 13:22   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А Птиц - это кто?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2011, 14:54   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Цитата:
О, дорогой Аватар, вы мужественный Птиц!!!!))
А Птиц - это кто?
это было написано почти в два часа ночи.. думаю, что подразумевалось: "Принц"


Blondy, насколько я понимаю, вопросы уже снялись сами собой?
Ну да, выборкам/подзапросам можно давать имена. Иногда это полезно, а иногда - даже строго обязательно!

вопрос с выборкой студентов всех групп (если максимальное число более чем в одной группе) Аватар уже закрыл. (а кто бы сомневался!!! )


Blondy, позвольте ещё дать маленький совет.
Есть такая книжка, Мартин Грубер "Понимание SQL" (она же "Understanding SQL")
Она для использования SQL, имхо, как букварь. Основные принципы SQL я изначально почерпнул именно из этой книжки. (ну а потом опыт, решение возникающих практических задач, чтение форумов (очень силён форум sql.ru)... ну и учитывать надо, что во всех СУБД свои "фишки", где-то удобнее, где-то менее - нет). Полистайте её, вдруг понравится!..


p.s. Спасибо за добрые слова!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.10.2011, 00:18   #8
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,386
По умолчанию

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

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

Добавление 23:22
В догонку - я нашла электронный вариант книги, счас глазами пробегу - полный это вариант, или обрезанный.

Дорогой Аватар, у меня прямо-таки пожарная ситуация - на Ваш запрос среда произносит страшное слово "ambiguous":
Цитата:
ERROR: column reference "t_group" is ambiguous

********** Ошибка **********

ERROR: column reference "t_group" is ambiguous
SQL state: 42702
Это наверное значит, что Слону не нравится то, что колонки t_group называются одинаково когда мы выполняем группировку в подзапросе. Значит нужны псевдонимы для этих колонок. А разве группировка воспримет псевдоонимы?
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Stilet; 30.10.2011 в 11:29.
Blondy вне форума Ответить с цитированием
Старый 30.10.2011, 01:26   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Наверно еще один псевдоним добавить надо
Код:
SELECT Gr.t_code,Gr.first_name,Gr.second_name,Gr.t_group
  FROM "Student" AS Gr,
       (SELECT t_group,COUNT(t_group) AS cnt FROM "Student" GROUP BY t_group) AS Gr1,
       (SELECT t_group,COUNT(t_group) AS cnt FROM "Student" GROUP BY t_group ORDER 2 DESC LIMIT 1) AS Gr2
  WHERE Gr.t_group=Gr1.t_group AND Gr1.cnt=Gr2.cnt
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.10.2011, 01:39   #10
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,386
По умолчанию

Вот мне бы такую умную голову, как у Вас))) Все работает теперь))

Я чтобы не быть совсем уж блондинкой тоже паралельно действовала. Но я накрутила псевдонимы совсем не там, где Вы)) Вот что получилось у меня:
Код:
SELECT t_code, first_name, second_name, t_group
  FROM "Student" 
       (SELECT st1.t_group,COUNT(st1.t_group) AS cnt FROM "Student" AS st1 GROUP BY cnt) AS Gr1,
       (SELECT st2.t_group,COUNT(st2.t_group) AS cnt FROM  "Student"  AS st2 GROUP BY cnt ORDER BY 2 DESC LIMIT 1) AS Gr2
  WHERE t_group=Gr1.t_group AND Gr1.cnt=Gr2.cnt

Естественно фокус не удался))) Среда запнулась сразу на втором Селекте)))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод характеристик ОП в таблицы GPSS GaJIbI4 Помощь студентам 5 25.06.2012 10:07
Выборка двух характеристик из списка tns-ka Microsoft Office Excel 2 21.10.2010 12:29
Выборка по номеру или значению sergeyminb Microsoft Office Excel 9 27.08.2010 16:09
Выборка чисел по значению другого столбца faker Microsoft Office Excel 4 10.11.2009 14:40
Выборка строк из таблицы по значению TDBLookupComboBox Gringo БД в Delphi 4 28.10.2008 05:45