2014-01-04 2 views
-1

Я хочу присоединиться к объединению 2 выбрать в одном запросе:Сделать выбор для двух select sql/oracle

Вот два запроса.

 SELECT player_id, SUM(score) score 
    FROM (
     SELECT id_p1 player_id, score_p1 score 
     FROM matchs 
     UNION ALL 
     SELECT id_p2, score_p2 
     FROM matchs 
    ) q 
     GROUP BY player_id 

И

SELECT player_id, SUM(score) score 
    FROM (
     SELECT id_p1 player_id, score_p2 score 
     FROM matchs 
     UNION ALL 
     SELECT id_p2, score_p1 
     FROM matchs 
    ) q 
    GROUP BY player_id 

Спасибо!

+0

См. CASE ... WHEN ... THEN ... END – Strawberry

+0

Попробуйте СОЕДИНЯТЬ их. – Mihai

+0

Создайте представление для каждого запроса на объединение и попытайтесь присоединиться к – user1844933

ответ

1

Попробуйте

SELECT table1.player_id, table1.score score1, table2.score score2, 
     abs(table1.score - table2.score) difference 
FROM (
     SELECT player_id, SUM(score) score 
     FROM (
       SELECT player1_id player_id, score_p1 score FROM matchs 
       UNION ALL 
       SELECT player2_id , score_p2 FROM matchs 
      ) q GROUP BY player_id 
    ) table1 
INNER JOIN 
      (
      SELECT player_id, SUM(score) score 
      FROM (
        SELECT player1_id player_id, score_p2 score FROM matchs 
        UNION ALL 
        SELECT player2_id , score_p1 FROM matchs 
       ) q GROUP BY player_id 
     ) table2 ON table1.player_id = table2.player_id 

SQL Fiddle Demo

+0

mysql tag ...... – Mihai

+0

@Upendra У меня есть эта ошибка: # 1052 - Столбец 'player_id' в списке полей неоднозначен – user3149518

+0

@ user3149518: Обновите свой последний ответ с помощью демонстрационной ссылки –

0

В идеале можно было бы выполнить эту операцию с помощью FULL JOIN:

SELECT  COALESCE(t1.player1_id, t2.player2_id) 
      SUM(COALESCE(t1.score_p1,0) + COALESCE(t2.score_p2,0)) 
FROM  table_name t1 
    FULL JOIN table_name t2 ON t1.player1_id = t2.player2_id 
GROUP BY COALESCE(t1.player1_id, t2.player2_id) 

Однако, к сожалению, MySQL не имеет встроенной поддержки такой объединить операцию. Вместо этого, можно имитировать его, сделав UNION между а LEFT JOIN и RIGHT JOIN, то агрегирование:

SELECT p, SUM(s) FROM (

    SELECT  t1.player1_id p, SUM(t1.score_p1 + IFNULL(t2.score_p2,0)) s 
    FROM   table_name t1 
    LEFT JOIN table_name t2 ON t1.player1_id = t2.player2_id 
    GROUP BY  t1.player1_id 

    UNION 

    SELECT  t2.player2_id, SUM(IFNULL(t1.score_p1,0) + t2.score_p2) 
    FROM   table_name t1 
    RIGHT JOIN table_name t2 ON t1.player1_id = t2.player2_id 
    GROUP BY  t2.player2_id 

) t GROUP BY p 

Посмотри на sqlfiddle.

+0

Спасибо за помощь! :) – user3149518

Смежные вопросы