Маленький вопросик по SQL

Geddi-S

Есть три таблицы - A, B, C.
Соединяем их вместе, причем пусть их кортежи - это A1, B1, B2, C1, C2, C3, C4, C5, C6.
Вполне возможна, например, следующая ситуация после соединения:

A1 B1 C1
A1 B1 C2
A1 B1 C3
A1 B2 C4
A1 B2 C5
A1 B2 C6

Хотелось бы после GROUP BY A.id иметь возможность считать sum B.<некоторое поле>, только так, чтобы сумма велась по разным строкам B (т.е. должно быть B1+B2, а не 3*B1+3*B2).
Не подскажите, как бы грамотно составить вопрос?
Если что, mysql 4.1.21

oleg701

А можно маленький вопросик?
Если тебе нужно считать сумму по B, зачем тебе объединять еще и с C?

Geddi-S

По C тоже нужно считать аггрегирующие функции...
Короче, открыл для себя, что в моем mysql есть подзапросы, проблему решил типа так:

SELECT *, SUM(num)
FROM (
SELECT A.*, B.id AS id_b, count(B.id sum(B.<поле>)/count(B.id) AS num
FROM A LEFT JOIN B ON A.id = B.id_a
LEFT JOIN C ON B.id = C.id_b GROUP BY B.id ) D
GROUP BY D.id

Но мне не нравится (
Можно как-нибудь без подзапросов?

oleg701

Не, какая-то неопределенная задача получается.
В том запросе, что ты привел, таблица C вообще не используется в выборке.
Расскажи что за задача нормальными словами.
Может там все решится грамотным JOIN'ом.

Geddi-S

Я просто не писал второстепенные столбцы итп.
Короче, есть три таблицы. Первая связана со второй, а вторая - с третьей (через ключи). И никак иначе.
Связи такого типа: одна строка из второй может быть связана со многими из третьей, а одна строка первой может бть связана со многими из второй.
Нужно сделать такой запрос, чтобы по каждой строке из первой таблицы были выполнены различные аггрегирующие функции типа sum и count как для второй таблицы, так и для третьей.

oleg701

То есть ты хочешь выборку типа
A1, SUM(B1.field1 SUM(C1.field2)
A1, SUM(B1.field1 SUM(C2.field2)
A1, SUM(B1.field1 SUM(C3.field2)
A2, SUM(B2.field1 SUM(C4.field2)
A2, SUM(B2.field1 SUM(C5.field2)
?

Geddi-S

Вроде того, но скорее так:

A1, B1.field1+B2.field1, C1.field2+C2.field2+C3.field2+C4.field2+C5.field2+C6.field2
...

(если работать с обозначениями из моего первого поста)

oleg701

Что-то такое нарисовалось, но не проверял.
Возможно нужно напильником доработать.
SELECT A.id, SUM(D.field1B SUM(D.sumC) FROM A LEFT JOIN
(SELECT b.id AS idB, b.field1 AS field1B, SUM(c.field1/COUNT(field1 AS sumC
FROM b LEFT JOIN c ON b.id=c.id
GROUP BY b.id, b.field1) AS D
ON A.id = D.idB
GROUP BY A.id

Geddi-S

принцип то же, что и я написал в самом начале с подзапросом
блин, отстой
мне чего-то казалось, что всегда можно без подзапросов обходиться...

oleg701

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

Geddi-S

Жаль...
Просто раньше стоял mysql 3.23, я с таким даже не сталкивался, только в теории.. вот пришлось и на практике теперь.
В итоге пришли к одному и тому же решению )
Оставить комментарий
Имя или ник:
Комментарий: