powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Правильная группировка при объединении трёх таблиц - помогите :(
6 сообщений из 6, страница 1 из 1
Правильная группировка при объединении трёх таблиц - помогите :(
    #40005032
JannyDoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Сразу скажу - я в sql ноль и если будете писать "ну и курица, какой глупый вопрос" - будете правы. Но вдруг кто сможет помочь... Я уже измучилась и перечитала кучу статей, перепробовала что можно, но до меня не доходит.

Две таблицы я в мучениях объединила-таки, результат выдаёт правильный. А вот при объединении трёх таблиц группирует ну просто абы как.

Дано три таблицы: festival_history ( в ней столбцы team_id и sum(score ), teams ( столбец title ) и team_players ( столбцы player_id и role )

Сделала группировку двух - всё супер:

select team_id, sum(score), title
from festival_history
left join teams
on (festival_history.team_id = teams.id)
where festival_id in ( 291)
group by team_id, teams.title
ORDER BY sum DESC
limit 10

Группировка трёх - абы что. Мне кажется из-за того что в строку group by добавляется team_players.player_id , но если не добавлять, то выдает ошибку: либо добавить либо or be used in an aggregate function LINE 1:

select festival_history.team_id, sum(score), title, player_id
from festival_history
left join teams
on (festival_history.team_id = teams.id)
left join team_players
on (teams.id = team_players.player_id)
where festival_id in ( 291)
and role = 2
group by festival_history.team_id, teams.title, team_players.player_id
ORDER BY sum(score) DESC
limit 10



Я не понимаю как мне эти три таблицы объединить чтобы всё было как нужно. Третья таблица это всего лишь ID игрока который принадлежит команде, но как я ни пыталась что-то сделать, либо абы что либо ошибки....

Я буду безмерно благодарна если кто-то сможет помочь понять что не так и как сделать чтобы было как нужно :(
...
Рейтинг: 0 / 0
Правильная группировка при объединении трёх таблиц - помогите :(
    #40005127
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JannyDoe, если в селекте более 1 таблицы, все имена полей обязательно указывайте с именем (или алиасом) таблицы.
Третья таблица должна иметь поле team_id, и вот по нему следует связывать.
Ну и про форматирование не забывайте, типа так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT fh.team_id, SUM(fh.score) summa, t.title, tp.player_id
FROM festival_history fh
LEFT JOIN teams t ON fh.team_id = t.id
LEFT JOIN team_players tp ON t.id = tp.team_id
WHERE fh.festival_id = 291
  AND tp.role = 2
GROUP BY fh.team_id, t.title, tp.player_id
ORDER BY summa DESC
limit 10
...
Рейтинг: 0 / 0
Правильная группировка при объединении трёх таблиц - помогите :(
    #40005144
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JannyDoe,

Объединение трех таблиц ничем не отличается от двух.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT tm.team_id, ts.title, sum(?.score) -- из какой таблицы это score?
FROM festival_history AS tm -- если таблиц больше 1шт, алиасы таблиц нужны
LEFT JOIN teams AS ts ON (tm.team_id = ts.id) -- объединяем с этой таблицей на условии равенства этих полей

-- то есть, к каждой записи из tm "приклеиваем" такую запись(и) из "дочерней" ts, где условие выполняется.
-- если в дочерней таких несколько, значит итого записей станет БОЛЬШЕ (дублирование родительской части)
-- LEFT - означает "все записи из родителя, даже если условие НЕ выполнено (дополняем NULL-значениями)

WHERE tm.festival_id  = 291
GROUP BY tm.team_id, ts.title -- группируем выборку, "собирая в одну запись" по одинаковости этих полей
ORDER BY ?.sum DESC -- из какой таблицы поле sum?
limit 10



С конца: прим. к GROUP BY означает, что если в группировку попало несколько записей, то в вывод SELECT попадет Сумма всех полей score такого попадалова. ПОЭТОМУ, в выводе должны быть или ключи группировки или агрегатные функции.

Объединение может "размножать" записи из родительской таблицы. Объединение выдает как-бы "расширенную таблицу" из всех полей всех объединяемых таблиц в части SELECT вы оставляете только нужное Вам.

Добавление третьей таблицы - ничего не меняет выше из выводов .. итого станет ишо "ширее". :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select festival_history.team_id, sum(score), title, player_id
from festival_history
left join teams on (festival_history.team_id = teams.id)
left join team_players on (teams.id = team_players.player_id)

where festival_id in ( 291) and role = 2

group by festival_history.team_id, teams.title, team_players.player_id

ORDER BY sum(score) DESC
limit 10



Если добавить, то player_id становится ключом группировки, и выход с тремя ключами - уникален. Есть только одна результирующая запись.
Если убрать player_id из GROUP BY то записей с уникальными ключами team_id И title становится НЕСКОЛЬКО. Из КАКОЙ записи Вам требуется player_id?

Чтобы это указать, как раз и нужны АГРЕГАТНЫЕ функции. Чтобы увидеть все игроков, воткните GROUP_CONCAT() по смотрите сколько записей собирается группировкой по двум полям. Какие там попадаются player_id .. может это поможет понять какой из них нужен (первый, последний, все скопом, самый большой, наименьший и т.д)
:)
...
Рейтинг: 0 / 0
Правильная группировка при объединении трёх таблиц - помогите :(
    #40005146
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы порекомендовал сделать пару-тройку простеньких табличек с 2-3 полями и "поиграться с объединениями", левым, правым, декартовым .. многое станет понятней, особенно если рядом есть учебник.
...
Рейтинг: 0 / 0
Правильная группировка при объединении трёх таблиц - помогите :(
    #40005157
JannyDoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
paver, спасибо большое! Это работает, невероятно! Теперь мне нужно есть и разобраться в запросе чтобы понять как и что сделано, чтобы в будущем с другими таблицами я смогла сделать так же.... Спасибо вам большое
...
Рейтинг: 0 / 0
Правильная группировка при объединении трёх таблиц - помогите :(
    #40005161
JannyDoe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109, Ох... sum(?.score) это было из таблички festival_history, в других просто не было такого score параметра и я вот так его одиноко и указала.

Спасибо большое за комментарии, приписки и объяснения!! Я их читаю и понимаю что моя голова работает в каком-то другом направлении, да еще и знаний мало.

Скажем так, я в этом деле даже не новичок, а ноль)) Могу только простенькие запросы делать из одной таблицы и вот, как оказалось, две тоже могу объединить чудом) Третья уже за гранью для меня

Но я постараюсь для себя всё же понять и чуть углубиться, на случай если понадобится еще в работе заняться такой деятельностью)

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

Спасибо вам большое на информацию и объяснение!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Правильная группировка при объединении трёх таблиц - помогите :(
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]