IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> SQL несколько LEFT join ?
Rian
сообщение 14.04.2011 16:06
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 394
Пол: Мужской

Репутация: -  9  +


сдраствуйте например есть таблицаЖ

студенты
-математика
-физика
-чистописание
-пение
-музыка

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

------------- математика--------физика----------чистописание
---------------------------------------------------------------------
иванов -----------5--------------- - --------------------3--------
---------------------------------------------------------------------
петров-------------6---------------7-------------------- - -------
для одной подчиненной таблицы LEFT JOIN нормально делает а больше начинает множить записи...
как правильно делать
я пробую

users LEFT JOIN (мат LEFT JOIN физ LEFT JOIN чист) on users.id

Сообщение отредактировано: Rian - 14.04.2011 16:07


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
volvo
сообщение 14.04.2011 16:08
Сообщение #2


Гость






Еще раз: сколько у тебя таблиц и как они связаны? На каждый предмет своя таблица, и во всех есть поле ID? Тогда так:

SQL
SELECT users.name, math.mark, physics.mark, russian.mark
FROM ((users LEFT JOIN math ON users.ID = math.ID) LEFT JOIN physics ON users.ID = physics.ID)
LEFT JOIN russian ON users.ID = russian.ID;
 К началу страницы 
+ Ответить 
Rian
сообщение 15.04.2011 10:27
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 394
Пол: Мужской

Репутация: -  9  +


Цитата(volvo @ 14.04.2011 16:08) *

Еще раз: сколько у тебя таблиц и как они связаны? На каждый предмет своя таблица, и во всех есть поле ID?


Код

'SELECT first_n, last_n, SUM(math.mark) as math, SUM(phis.mark)as phis, SUM(log.mark)as log  '+
        'FROM((users LEFT JOIN math ON users.id = math.user_id) '+
          'LEFT JOIN phis ON users.id = phis.user_id) '+
            'LEFT JOIN log ON users.id = log.user_id '+
        'GROUP BY users.id ';


...если правильно понял, но
первая добавляется нормально, а все остальные начинают множить записи

ЗЫ одна таблица студенты и к ней подключется еще 3 таблицы с оценками (по каждому предмету)
а в каждой из них оценки по темам за весь год


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rian
сообщение 15.04.2011 11:16
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 394
Пол: Мужской

Репутация: -  9  +


а можно сделать соединить строки после UNION???

например

(user LEFT JOIN math
UNION
user LEFT JOIN phis
UNION
user LEFT JOIN log)
group by user.id

...сделал подзапрос, если вариант без union покороче есть буду рад

Сообщение отредактировано: Rian - 15.04.2011 11:37


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.04.2011 12:20
Сообщение #5


Гость






Ничего нигде не множится (запрос - буква в букву из моего первого ответа)...


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
Rian
сообщение 15.04.2011 12:26
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 394
Пол: Мужской

Репутация: -  9  +


Цитата(volvo @ 15.04.2011 12:20) *

Ничего нигде не множится (запрос - буква в букву из моего первого ответа)...

а если оценок много и их нуна сложить или вычислить среднюю?


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.04.2011 12:46
Сообщение #7


Гость






Где-то в вопросе было указано про сложение или вычисление среднего? Не было. Даже если так. Вот так - все оценки по пользователям суммируются:

SQL
SELECT users.name, Sum(math.mark) AS SumOfmark, Sum(physics.mark) AS SumOfmark1,
Sum(russian.mark) AS SumOfmark2
FROM ((users LEFT JOIN math ON users.ID = math.userID) LEFT JOIN russian ON users.ID = russian.userID)
LEFT JOIN physics ON users.ID = physics.userID
GROUP BY users.name;

Где множит записи?
Прикрепленное изображение

Вот так - среднее:
SQL
SELECT users.name, Avg(math.mark) AS AvgOfmark, Avg(physics.mark) AS AvgOfmark1,
Avg(russian.mark) AS AvgOfmark2
FROM ((users LEFT JOIN math ON users.ID = math.userID) LEFT JOIN russian ON users.ID = russian.userID)
LEFT JOIN physics ON users.ID = physics.userID
GROUP BY users.name;
Опять множит?
Прикрепленное изображение
 К началу страницы 
+ Ответить 
Rian
сообщение 15.04.2011 13:01
Сообщение #8


Знаток
****

Группа: Пользователи
Сообщений: 394
Пол: Мужской

Репутация: -  9  +


вроде должно...
у меня каша...
я подумаю


--------------------
Objective-C, Unity3d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 23.07.2025 1:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"