Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sum() при связах многие ко многим, и как с этим лучше бороться 
V
    Опции темы
Bulat
Дата 18.11.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Две таблицы, связь многие ко многим.

Если из первой суммировать значения по определенному полю, то мы получаем то, что есть на самом деле. Но если при этом сделать left join table2, то есс-но наша сумма возрастет в разы. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
sir_nuf_nuf
Дата 18.11.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 8
Всего: 31



Bulat, да так и есть. в чем проблема? что хотим получить?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Bulat
Дата 18.11.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



sir_nuf_nuf, хотим получить методы борьбы с этим вообще, если таковые имеются. Ибо, джойнить таблицы нужно, и каждый раз уходит в составление очень сложных запросов надоело smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
skyboy
Дата 18.11.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



муа-ха-ха. месье хочет извращений? по рукам!
Код

SELECT sum(table1.field) * count(distinct table1.primary_key) / count(table1.primary_key)

идея в том, что поле первичного ключа первой таблицы повторится столько же раз в результате, сколько и суммируемое поле. следовательно, "count(distinct table1.primary_key) /  count(table1.primary_key)" даст количество повторений, то есть количество присоединяемых из второй таблицы строк. можно было просто поделить сумму на count(table2.primary_key), но в случае, если из второй таблицы подключается 0 строк, пришлось бы для избежания деления на 0 вставлять IF.

Добавлено через 1 минуту и 47 секунд
Цитата(Bulat @  18.11.2008,  14:07 Найти цитируемый пост)
хотим получить методы борьбы с этим вообще

бороться с тем, что "2 + 2 = 4 в десятичной системе счисления" - донкихотство и/или наивность. 
PM MAIL   Вверх
Bulat
Дата 19.11.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(skyboy @  18.11.2008,  15:25 Найти цитируемый пост)
бороться с тем, что "2 + 2 = 4 в десятичной системе счисления" - донкихотство и/или наивность.  


Не ожидал услышать от тебя такие глупости. smile В том-то и дело, что я хочу боротся с тем, что 2+2 > 4

А насчет извращений, уж проще попытатся побороть то, что 2+2 > 4

чем расписывать джойны в виде 
join (
  select ...
)

а после него еще и 

union (
)


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
skyboy
Дата 19.11.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Bulat @  19.11.2008,  10:23 Найти цитируемый пост)
Не ожидал услышать от тебя такие глупости

ну, так, я вообще на глупости горазд.
Цитата(Bulat @  19.11.2008,  10:23 Найти цитируемый пост)
В том-то и дело, что я хочу боротся с тем, что 2+2 > 4

в результате умножения таблиц получаем, что некоторые поля дублируются. неожиданно?
в результате сложения продублированных значений получаем сумму, отличную от суммы однократно учтенных значений. неожиданно?
ты пытаешься минимизировать количество запросов и из-за этого пеняешь на вполне адекватное поведение группировки.
PM MAIL   Вверх
Akina
Дата 19.11.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Bulat @  18.11.2008,  15:53 Найти цитируемый пост)
Две таблицы, связь многие ко многим.

Как организована связь? через третью таблицу? или еще как?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sir_nuf_nuf
Дата 19.11.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 8
Всего: 31



Bulat, есть реляционная алгебра. Там сказано, что функции, равно как и агрегатные функции применяются к ТАБЛИЦЕ (а не к двум)

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

поэтому , если вы хотите иметь какую либо сумму, по одной таблице - ее нужно считать до джойна.

например:
Код

select t2.name, s.sum_value
from t2,
(
  select id, sum(value) sum_value
  from table1
  group by id
) s
where
t2.id = s.id



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0647 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.