powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос
9 сообщений из 9, страница 1 из 1
Сложный запрос
    #39037879
Evgeniy57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток!
Понадобилось составить, довольно, сложный (может для меня) запрос, но все мои попытки ни к чему не приводят. Вот решил обратиться за помощью.

Имеем 3 таблицы .

tableA tableB tableC
--------------- ---------------- -----------------
id name id a_id flag id b_id cost
1 name1 1 1 1 1 1 100
2 name2 2 1 1 2 1 150
3 2 0 3 1 50
4 2 0 4 2 900
5 2 1 5 2 700
6 5 600

В результате запроса нужно получить что-такое:

query
----------------------------------------------------------------------------
name b_count b_count_flag c_count c_avg_cost c_sum_cost
name1 2 2 5 530 1250
name2 2 1 1 600 600

Вообще там еще нужно будет посчитать несколько значений, но суть та же.

Ничего лучше, чем сделать куча отдельных запросов в селекте не придумал, но это же ужасное решение, БД очень большая.

Очень прошу любой помощи, сам похоже не справлюсь еще долго:)
Заранее благодарю.
...
Рейтинг: 0 / 0
Сложный запрос
    #39037901
Evgeniy57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не сразу заметил, что съехало, простите.
...
Рейтинг: 0 / 0
Сложный запрос
    #39038055
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не хватает воображения, чтобы представить, что именно может вызвать трудности в построении этого, ну просто до жути тривиального, запроса...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT a.name               name
     , COUNT(DISTINCT b.id) b_count
     , SUM(b.flag)          b_count_flag
     , COUNT(c.id)          c_count
     , AVG(c.cost)          c_avg_cost
     , SUM(c.cost)          c_sum_cost
FROM tableA a
   , tableB b
   , tableC с
WHERE a.id = b.a_id 
  AND b.id = c.b_id
GROUP BY a.name
...
Рейтинг: 0 / 0
Сложный запрос
    #39038554
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SUM(b.flag) = 5/1, а должно быть 2/1.
...
Рейтинг: 0 / 0
Сложный запрос
    #39038615
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люблю идиотские решения, получаемые в результате рихтовки решений неправильных...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT a.name                                                       name
     , COUNT(DISTINCT b.id)                                         b_count
     , COUNT(DISTINCT (case b.flag when 0 then null else b.id end)) b_count_flag
     , COUNT(c.id)                                                  c_count
     , AVG(c.cost)                                                  c_avg_cost
     , SUM(c.cost)                                                  c_sum_cost
FROM tableA a
   , tableB b
   , tableC c
WHERE a.id = b.a_id
  AND b.id = c.b_id
GROUP BY a.name;
...
Рейтинг: 0 / 0
Сложный запрос
    #39038654
AlexSes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
угу.. Интересное решение. Смысла, только в b_count тогда нет, но это уж к ТС:)
Вот если б flag был не 1/0, тогда задача таким запросом не решаема.
...
Рейтинг: 0 / 0
Сложный запрос
    #39038891
Evgeniy57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да решение простое, не знаю почему у меня не получилось самому. Спасибо.

Только запрос возвращает неправильно в том случае, если у записи в tableB нет ни одной записи в table C, он такие просто пропускает.
...
Рейтинг: 0 / 0
Сложный запрос
    #39038893
Evgeniy57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть количество записей в tableB получается без таких записей.
...
Рейтинг: 0 / 0
Сложный запрос
    #39039052
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgeniy57То есть количество записей в tableB получается без таких записей.


почитайте про LEFT JOIN, типа:

Код: sql
1.
2.
3.
4.
5.
....
FROM tableA a
   JOIN tableB b ON a.id = b.a_id
   LEFT JOIN  tableC c ON b.id = c.b_id
GROUP BY ....
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]