Помогите с SQL запросом

sani

Новичок
Помогите с SQL запросом

Добрый день. Пожалуй начну с типа таблиц.

Есть 3 таблицы: Главная (MAIN_T), и 2 второстипенных (SUM_T1, SUM_T2).

Структуры:
MAIN_T - ID (int prim.key), NAME (varchar), ID_TOW (varchar)
SUM_T1, SUM_T2 - ID (int prim.key), THE_VAL (int), ID_TOW (varchar)
PHP:
MAIN_T
===================
ID   NAME   ID_TOW
1     aaaa         32
2     bbbb         66
3     ccccc         75
===================

SUM_T1
===================
ID   THE_VAL   ID_TOW
1          30            66
2          15            75
3          20            66
4          10            32
===================

SUM_T2
===================
ID  THE_VAL    ID_TOW
1        10              32
2        20              66
3        15              32
4        40              66
5        60              75
6        10              75
===================
Надо вытащить все строки из MAIN_T, а также суммы полей THE_VAL из SUM_T1, SUM_T2 где
MAIN_T.ID_TOW = SUM_T1.ID_TOW и MAIN_T.ID_TOW = SUM_T2.ID_TOW


В результате я должен получить:

PHP:
ID    ID_TOW    NAME    SUM_THE_VAL_T1    SUM_THE_VAL_T2
============================================
1          32         aaaa               10                               25
-------------------------------------------------------------------------------
2          66         bbbb                50                              60
-------------------------------------------------------------------------------
3          75         cccc                  15                               70
============================================

Вот мой запрос:

PHP:
SELECT MAIN_T.ID,MAIN_T.ID_TOW,MAIN_T.NAME,SUM(SUM_T1.THE_VAL) AS SUM_THE_VAL_T1,SUM(SUM_T2.THE_VAL) AS SUM_THE_VAL_T2
FROM MAIN_T
LEFT JOIN SUM_T1 on MAIN_T.ID_TOW = SUM_T1.ID_TOW
LEFT JOIN SUM_T2 on MAIN_T.ID_TOW = SUM_T2.ID_TOW
GROUP BY MAIN_T.ID;
Но он выводит не правильно:
PHP:
ID    ID_TOW    NAME    SUM_THE_VAL_T1    SUM_THE_VAL_T2
============================================
1          32         aaaa               15                               20
-------------------------------------------------------------------------------
2          66         bbbb                180                             40
-------------------------------------------------------------------------------
3          75         cccc                  10                               110
============================================
Чем это вызванно, и как сделать правильный запрос.

Заранее Очень благодарен.

Спасибо.
 

chira

Новичок
a tak?
Код:
SELECT MAIN_T.ID,MAIN_T.ID_TOW
,MAIN_T.NAME
,SUM(SUM_T1.THE_VAL)/COUNT(*)*COUNT(DISTINCT SUM_T1.ID) AS SUM_THE_VAL_T1
,SUM(SUM_T2.THE_VAL)/COUNT(*)*COUNT(DISTINCT SUM_T2.ID) AS SUM_THE_VAL_T2
FROM MAIN_T
  LEFT JOIN SUM_T1 on MAIN_T.ID_TOW = SUM_T1.ID_TOW
  LEFT JOIN SUM_T2 on MAIN_T.ID_TOW = SUM_T2.ID_TOW
GROUP BY MAIN_T.ID;
 

sani

Новичок
Слушай :) Ты гений. Токо объясни, как это работает?

P.S.

У сожалению у меня очень много записей в таблице.. Запрос выполняется более 5 секунд. Вот в этом беда..
 

litvinenko

Новичок
Кажется, если написать так, то MySQL сам определит, какие таблицы брать вначале соединения, какие потом. Можно протестировать при помощи EXPLAIN SELECT

SELECT mt.ID, mt.ID_TOW, mt.NAME
,SUM(st_1.THE_VAL)/COUNT(*)*COUNT(DISTINCT SUM_T1.ID) sum_the_val_t1
,SUM(st_2.THE_VAL)/COUNT(*)*COUNT(DISTINCT SUM_T2.ID) sum_the_val_t2
FROM MAIN_T mt, SUM_T1 st_1, SUM_T2 st_2
WHERE
mt.ID_TOW = st_1.ID_TOW AND
mt.ID_TOW = st_2.ID_TOW
GROUP BY MAIN_T.ID;
 

chira

Новичок
sani

индексы есть? какие?

-~{}~ 08.02.07 00:21:

Токо объясни, как это работает?
если хочешь понять как это работает, убери GRUOP BY, SUM и посмотри внимательно на данные которые будут группироваться.
надеюсь поймёшь как это работает.

удачи :)
 
Сверху