Для каждого матча выберите идентификаторы игрока/команды хозяев

У меня есть таблица с идентификаторами матчей и соответствующими идентификаторами игроков/команд, выраженными как home_id. Каждая команда tid состоит из двух игроков, и у каждого игрока есть свой идентификатор pid. В таблице matches я не знаю, представляет ли столбец home_id команду или одного игрока.

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

Результат: значение строки использовано неправильно

SELECT match_id,
CASE WHEN (SELECT pid FROM players WHERE m.home_id = pid)
            IS NULL THEN (SELECT pid_1, pid_2 FROM teams WHERE m.home_id = tid)
        ELSE (m.home_id)
    END AS home_ids
FROM matches m

Как изменить мой запрос, чтобы он работал так, как задумано?

Таблица matches:

match_id home_id 18707060 149612 18707060 548355 18389439 146458 18389439 316081 18389511 334757 18389511 402979 18390491 87940 18390491 185150 18390555 164088 18390555 164374 18390785 95493 18390785 532349 14487258 24552 14487258 306032

players:

pid 87940 185150 164088 164374 24552 306032

teams:

время pid_1 pid_2 149612 149613 149728 548355 316251 316343 146458 146728 235888 316081 316073 316081 334757 334750 316079 402979 558506 558508 95493 315993 315997 532349 563020 563022

Желаемый результат:

match_id home_ids 18707060 (149613, 149728) 18707060 (316251, 316343) 18389439 (146728, 235888) 18389439 (316073, 316081) 18389511 (334750, 316079) 18389511 (558506, 558508) 18390491 (87940) 18390491 (185150) 18390555 (164088) 18390555 (164374) 18390785 (315993, 315997) 18390785 (563020, 563022) 14487258 (24552) 14487258 (306032)
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас есть все необходимые данные, просто вы их не выбираете. Что-то вроде этого должно помочь:

SELECT m.match_id, p.pid AS p_pid, t.pid_1 AS t_pid_1, t.pid_2 AS t_pid_2
FROM matches m
LEFT JOIN players p
ON m.home = p.pid
LEFT JOIN teams t
ON m.home = t.tid
WHERE
   NOT (
           p.pid IS NULL AND
           t.tid IS NULL
       )

По сути, мы выбираем все матчи, в которых существует игрок или команда с критериями соответствия m.home соответствующему идентификатору. Проблема, с которой вы, скорее всего, столкнетесь, заключается в том, что tid может быть равно pid, поэтому их можно путать.

Ответ принят как подходящий

Кажется, это дает вам то, что вы хотите, хотя вам действительно следует сначала исправить свою модель данных:

SELECT M1.MATCH_ID
,P.PID HOME_IDS
FROM MATCHES M1
LEFT OUTER JOIN PLAYERS P ON M1.HOME_ID = P.PID
WHERE P.PID IS NOT NULL
UNION
SELECT M2.MATCH_ID
,T1.PID_1||', '||T1.PID_2 HOME_IDS
FROM MATCHES M2
LEFT OUTER JOIN TEAMS T1 ON M2.HOME_ID = T1.TID
WHERE T1.TID IS NOT NULL
order by 1,2
;
LEFT OUTER JOIN PLAYERS P ON M1.HOME_ID = P.PID WHERE P.PID IS NOT NULL можно переписать как JOIN PLAYERS P ON M1.HOME_ID = P.PID. Подобную перезапись можно использовать и для другой ветви объединения.
Lennart - Slava Ukraini 08.07.2024 14:11

Другие вопросы по теме