2014-05-23 6 views
0

У меня есть два разных запроса. Один для «плюс» и один для «минус». Я хочу найти разницу в значении счета для каждого игрока.MySQL вычисляет разницу в столбце count между двумя запросами

Я попытался объединить все и получил некоторые очень странные цифры.

Вот результаты каждого запроса, который я нед найти разницу:

fk_plus_player1_id cnt 
90     71 
65     68 
79     66 
45     59 
64     57 
27     56 
55     56 
93     55 
37     55 
40     44 
1     36 
84     33 
20     31 
24     28 
8     23 


fk_minus_player1_id cnt 
93     44 
64     42 
79     40 
37     35 
90     33 
20     31 
84     31 
27     30 
65     30 
40     26 
1     26 
24     25 
45     25 
55     22 
8     10 

Как бы это сделать? Заранее спасибо за вашу помощь. Я noob ...

UGH ... Попытка сделать метод соединения. Имея проблемы, не получая результатов, всего 4 пустых столбца. это то, что я пытаюсь

SELECT * FROM (SELECT заявление для результатов плюс здесь) AS ф

РЕГИСТРИРУЙТЕСЬ

(оператор выбора для результатов минус здесь) AS тм

О ф. fk_plus_player1_id = tm.fk_minus_player1_id

GROUP BY fk_plus_player1_id

любые предложения ??

+0

Вы должны присоединиться к записи на основе ключей, а затем сделать математику. Этот сайт может помочь вам понять синтаксис соединения. http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ – xQbert

ответ

0

У вас есть две таблицы. Вы хотите для каждого игрока разницу в счетах.

Итак:

SELECT t1.fk_minus_player1_id AS player, ABS(t1.cnt - t2.cnt) AS difference 
FROM table1 t1, table2 t2 
WHERE t1.fk_minus_player1_id = t2.fk_plus_player1_id 
GROUP BY t1.fk_minus_player1_id; 

Может быть, это то, что вы ищете?

WITH query1 AS 
(SELECT t1.fk_minus_player1_id AS player, (t1.cnt - IFNULL(t2.cnt,0)) AS difference 
FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.fk_minus_player1_id = t2.fk_plus_player1_id 
GROUP BY t1.fk_minus_player1_id), 
query2 AS (SELECT t2.fk_plus_player1_id AS player, (IFNULL(t1.cnt,0) - t2.cnt) AS difference 
FROM table2 t2 LEFT OUTER JOIN table1 t1 ON t1.fk_minus_player1_id = t2.fk_plus_player1_id 
GROUP BY t2.fk_plus_player1_id) 

(SELECT player, difference 
FROM query1) 

UNION 

(SELECT player, difference 
FROM query2 WHERE player NOT IN (SELECT player FROM query1)) 
+0

Привет @davidk. Я играю с вашим предложением, и он дает только одну строку, а не строку с каждым игроком. Кроме того, существует вероятность того, что количество вычислений игроков будет и должно быть отрицательным. Спасибо за любые другие предложения. – user3647071

0

Вы рискуете, что одни и те же игроки не находятся в обоих списках. Решение union all с group by:

select player1id, sum(pluscnt) as pluscnt, sum(minuscnt) as minuscnt, 
     (sum(pluscnt) - sum(minuscnt)) as diff 
from ((select player1id, cnt as pluscnt, 0 as minuscnt 
     from plustable 
    ) union all 
     (select player1id, 0, cnt 
     from minustable 
    ) 
    ) t 
group by player1id; 
+0

Спасибо Гордон. У меня такая же проблема с списком, что и в исходных запросах. Игрок будет равен нулю, если в противном случае не будет числа. упрощает ли ваш код? – user3647071

+0

Это означает, что вместо этого вы можете использовать 'join'. Поскольку MySQL не предлагает «полное внешнее соединение», вы рискуете потерять игрока в одном подзапросе или другом, если он/она не будет отсутствовать в наборе результатов. –