2011-03-02 2 views
0

Предположим, у меня есть следующая таблица GAMEКак выполнить следующее соединение в SQL?

match_id, user_id, score 
1, 10, 45 
1, 11, 57 
2, 10, 39 
2, 14, 63 

Теперь я хочу, чтобы сделать запрос, который получает игрок 10 и представляет свой счет вместе со счетом своих противников, как этот

match_id, user_id, score, opponent_id, opponent_score 
1, 10, 45, 11, 57 
2, 10, 39, 14, 63 
+2

Вы считаете, что меняете свой стол так, чтобы он (match_id, player1_id, player1_score, player2_id, player2_score)? Ваш вопрос, кажется, делает предположение, что всегда есть 2 игрока. Если вы не можете сделать это предположение, то что вы хотите вернуть в случае, если в матче есть более двух игроков? – tenfour

+0

Какая система баз данных и какая версия вы используете? –

+1

Это выглядит ужасно, как мое домашнее задание в пятницу – Woot4Moo

ответ

2
select P.match_id, 
     P.user_id, 
     P.score, 
     O.user_id as opponent_id, 
     O.score as opponent_score 
    from GAME P 
    join GAME O 
    on O.match_id = P.match_id 
    and O.user_id <> P.user_id 
    where P.user_id = 10 
order by P.match_id 

с помощью таблицы псевдонимов P «для проигрывателя», О «для противника»

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

from GAME P, GAME O 
    where O.match_id = P.match_id 
    and O.user_id <> P.user_id 
    and P.user_id = 10 

, но join должен работать для большинства.

1
SELECT 
    a.match_id, 
    a.user_id AS user_id, 
    a.score AS score, 
    b.user_id AS opponent_id, 
    b.score AS opponent_score 
FROM 
    game a 
JOIN 
    game b 
ON 
    a.match_id = b.match_id 
AND 
    a.user_id <> b.user_id 
WHERE 
    a.user_id = 10 

Изменить: сделал работу запроса так, как должен. Но посмотрите на ответ Рупа, чтобы он сделал это лучше.

+0

, вы на самом деле пытались запустить это? – tenfour

+0

mmh, после того, как я вижу ответ от Rup, я уже не уверен. Для этого также необходим «O.user_id <> P.user_id». Итак, нет, я не запускал его, извините, и Руп дал лучший ответ. – Enduriel

1
select 
    U.match_id, 
    U.user_id, 
    U.score, 
    O.user_id as opponent_id, 
    O.score as opponent_score 
from GAME U 
    inner join GAME O on 
     U.match_id = O.match_id and 
     U.user_id <> O.user_id 
where U.user_id = 10 
Смежные вопросы