Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
 Аватар для Левиафам
38 / 33 / 12
Регистрация: 31.05.2012
Сообщений: 586

Запрос связанных таблиц

10.02.2019, 15:34. Показов 10064. Ответов 5

Студворк — интернет-сервис помощи студентам
Привет всем! Есть две сущности:

а) User (id, name, mode)
b) Order(id, desc, status, user_id)

Связь "один ко многим". Мне нужно сделать запрос, которой вернет такого user, где:
1)режим mode='online'
2) user который имеет наименьшее число заказов
3) эти заказы у user имеют статус 'done'

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

Прошу помощи как можно написать такой запрос?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2019, 15:34
Ответы с готовыми решениями:

Как перебрать выборку из связанных таблиц на pl pgsql?
Добрый день форумчане. Вопрос в следующем. Пишу функция, которая связывает таблицы по Inner Join и делает выборку и расчеты. На этапе...

Запрос на выбору из многих связанных таблиц
Есть такая база как на картинке. Не могу написать запрос для нахождения фамилии сортировщика в ТПЦ 2 с наименьшим окладом. Мысли были...

Запрос из связанных таблиц
Есть три таблицы: A id | id1 | color B id1 | id2 C id2 | id3 Как одним запросом узнать color из A , если дано id3...

5
 Аватар для mvngr
225 / 189 / 98
Регистрация: 15.04.2018
Сообщений: 718
10.02.2019, 22:27
Для объединения двух таблиц один к многим используется LEFT JOIN
1) В конце: WHERE user.mode like 'online' --я не уверен, что у вас это строка
2) Читайте про group by, вам нужно min(order.id) и получить имя (как - читайте доку, ибо я не помню )
3) Опять же, WHERE order.status like 'done'
1
 Аватар для Левиафам
38 / 33 / 12
Регистрация: 31.05.2012
Сообщений: 586
10.02.2019, 23:55  [ТС]
Вот у меня получился такой вариант:

SQL
1
2
3
4
SELECT  user_id, COUNT(*) AS count_of_order
FROM ORDER r, users u 
WHERE u.id = r.user_id AND u.status = 'ONLINE'
GROUP BY r.user_id ORDER BY count_of_order LIMIT 1;
этот запрос отображает возвращает id пользователя, который в онлайне и у которого наименьшее число заказов. Но есть один нюанс, который я не могу реализовать. Нужно чтобы все имеющиеся заказы у пользователя были в статусе "done". Если сделать что то вроде " order.status like 'done' " - то он просто будет игнорировать заказы со статусом "open", а в моем случае если в заказах пользователя есть статус "open", то сразу его игнорировать и идти дальше.

Добавлено через 40 минут
вот пример с join - абсолютно одинаково работает как мой первый вариант


SQL
1
2
3
4
5
SELECT r.user_id, COUNT(*) AS count_og_order
FROM ORDER r
LEFT OUTER JOIN users u ON r.user_id = u.id
WHERE u.status='ONLINE'
GROUP BY user_id ORDER BY count_og_order LIMIT 1;
0
 Аватар для mvngr
225 / 189 / 98
Регистрация: 15.04.2018
Сообщений: 718
11.02.2019, 00:36
Лучший ответ Сообщение было отмечено Левиафам как решение

Решение

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

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT u.name, --имя
       COUNT(o.id) --количество заказов
FROM public."user" AS u --запрашиваем таблицу пользователей
LEFT JOIN
         (
         SELECT o.user_id --получаем id заказов (можно получать что угодно, но для краткости так)
         FROM public.order o WHERE STATUS LIKE 'open' --получаем записи, которые нам не подходят
         GROUP BY o.user_id -- и создаем их список
         )
             AS e ON e.user_id = u.id --тут мы объединяем с таблицей и в where смотрим записи, у которых поля из e нулевые (т.е. не существует таких записей у пользоватлея)
LEFT JOIN public."order" AS o ON o.user_id = u.id --теперь выводим все товары
WHERE e.user_id IS NULL --где для пользователя не сущетсвует неподходящего товара
  AND u.mode LIKE 'online' --и статус онлайн
GROUP BY u.name --получили мы всех доступных, теперь фильтруем их по именам и суммируем количество заказов
ORDER BY COUNT(o.id) ASC LIMIT 1 --а теперь сортируем от минимального количества заказов к максимальному и выставляем лимит на 1 запись (считай вывели максимальную запись благодаря этой строке)
В примере использовал вложенный запрос
1
 Аватар для Левиафам
38 / 33 / 12
Регистрация: 31.05.2012
Сообщений: 586
11.02.2019, 00:59  [ТС]
Спасибо большое! Вот вопрос такой. А как вывести id юзера?


Добавлено через 8 минут
заменил GROUP BY u.name на COUNT(o.id) и сделал SELECT u.id
чтобы вместо названия id выводил...правильно сделал?
0
 Аватар для mvngr
225 / 189 / 98
Регистрация: 15.04.2018
Сообщений: 718
11.02.2019, 07:41
Левиафам, да, покатит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2019, 07:41
Помогаю со студенческими работами здесь

Запрос из 2 связанных таблиц
Добрый день! Имеются 2 связанные таблицы. Spr (id, num, catnum, name, id_prim, Opisanie) Prim (id, Name_prim) Связаны spr....

Запрос на отображение связанных таблиц
Добрый день. Проблема с отображением связанных таблиц. Имеется БД access с 5 таблицами. Схема данных В один dataGridView надо...

Запрос на выборку из связанных таблиц
Как настроить запрос на выборку из двух связанных таблиц так, чтобы в результате были ВСЕ записи из первой таблицы, даже те которым не...

Запрос на вывод из связанных таблиц
Допустим у нас имеется такая ситуация: Есть две таблицы: Shop id name Product id price

SQL запрос для связанных таблиц
Добрый день, помогите пожалуйста с sql запросом, работаю в phpMyAdmin на MySQL. Есть таблицы со связями на первом изображении. При вводе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru