Помощь - Поиск - Пользователи - Календарь
Полная версия: SQL несколько LEFT join ?
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Rian
сдраствуйте например есть таблицаЖ

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

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

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

users LEFT JOIN (мат LEFT JOIN физ LEFT JOIN чист) on users.id
volvo
Еще раз: сколько у тебя таблиц и как они связаны? На каждый предмет своя таблица, и во всех есть поле 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
Цитата(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 таблицы с оценками (по каждому предмету)
а в каждой из них оценки по темам за весь год
Rian
а можно сделать соединить строки после UNION???

например

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

...сделал подзапрос, если вариант без union покороче есть буду рад
volvo
Ничего нигде не множится (запрос - буква в букву из моего первого ответа)...
Rian
Цитата(volvo @ 15.04.2011 12:20) *

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

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

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
вроде должно...
у меня каша...
я подумаю
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.