Newsgroup: it.comp.software.database
Titolo: [MySQL] - Sommare due colonne

Salve a tutti, dopo aver fatto la mia ricerchina su gugle, vi scrivo
per chiedere lumi su un problema di queries...
Dunque, io ho una tabella cosi' organizzata:
mysql> show columns from matches;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| match_id | smallint(6) |      | PRI | NULL    | auto_increment |
| data     | date        | YES  |     | NULL    |                |
| player1  | char(12)    | YES  |     | NULL    |                |
| player2  | char(12)    | YES  |     | NULL    |                |
| p1res    | char(1)     | YES  |     | NULL    |                |
| p2res    | char(1)     | YES  |     | NULL    |                |
| p1rank   | float(3,1)  | YES  |     | NULL    |                |
| p2rank   | float(3,1)  | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
8 rows in set (0.10 sec)
dove p1res e p2res possono valere W o L,  e p1rank e p2rank sono due
numeri opposti in segno.
Ho bisogno di una query che mi dia una tabella con la somma dei rank
raggruppati per giocatore, ma considerando che uno stesso nome puo'
apparire
a volte nella colonna player1 e altre nella colonna player2, ovvero:
se io faccio
mysql> SELECT player1, SUM(p1rank) AS somma1 FROM matches GROUP BY
player1;
+-----------+--------+
| player1   | somma1 |
+-----------+--------+
| Aaa       | 1676.0 |
| Ccc       | 1600.0 |
| Mmm       | 1555.7 |
| Sss       | 1671.5 |
| Ttt       | 1589.7 |
| Vvv       | 1627.6 |
+-----------+--------+
6 rows in set (0.08 sec)
mi da' quelle dei giocatori sotto player1, mentre con
mysql> SELECT player2, SUM(p2rank) AS somma2 FROM matches GROUP BY
player2;
+-----------+--------+
| player2   | somma2 |
+-----------+--------+
| Aaa       |   -2.1 |
| Ccc       |  -77.7 |
| Mmm       |    0.0 |
| Sss       |  -15.5 |
| Ttt       |   -2.0 |
| Vvv       |  -23.2 |
+-----------+--------+
6 rows in set (0.02 sec)
mi da' quelle dei giocatori sotto player2, che ovviamente sono gli
stessi :)
ora, io avrei bisogno di far uscire fuori una tabella con
NomeGiocatore e
somma1+somma2, ovvero joinare quelle due tabelle di prima sul nome e
sommare
i valori nelle due colonne, dopodiche' ordinare il risultato in ordine
decrescente per totale.
purtroppo le mie conoscenze di query complesse sono un po' troppo
arrugginite, e non so nemmeno se MySQL riesca a farne una di questo
genere (richiede le nested?)... ogni aiuto e' ben accetto, mi basta
anche un link su google + insulti :)
TIA
--                                                           
Vempł
"Possa la via dell'Eroe condurlo alla Triporta...
 alla Tritort, ehm, alla Trimorta."

 decrescente per totale.
io proverei cosě:
CREATE temporary table tmp
SELECT player2 as p, SUM(p2rank) AS somma
FROM matches GROUP BY
player2;
CREATE temporary table tmp2
SELECT player1 as p, SUM(p1rank) AS somma
FROM matches GROUP BY
player1;
select tmp.p,tmp.somma as positivi,
tmp2.somma as negativi,
tmp.somma+tmp2.somma as totale
from tmp left join tmp2 on tmp.p=tmp2.p
group by tmp.p;
drop table tmp;
drop table tmp2;
ciao

drop table tmp2;
Grazie per la risposta, e' proprio quello di cui avevo bisogno :)
Ora il mio pensare si e' spostato su una nuova questione: se io
creassi una tabella players, dove metto:
nickname (unico), nome, cognome, email, numero icq.
come dovrei fare per collegare questa nuova tabella alla tabella
matches di modo che, aggiornando un nickname, questo cambio si
ripercuota su tutte le righe di matches in modo automatico?
Ovvero: se il giocatore che ora si chiama AAA volesse domani cambiare
il suo nick in BBB, come dovrei fare per evitare di riscrivermi TUTTE
le righe con AAA in matches cambiandolo in BBB?
Leggendo il mio testo di DB ho scoperto l'esistenza delle foreign key,
ovvero attributi di una relazione(tabella) che si riferiscono alla
chiave primaria di una seconda relazione(tabella); questo sembrerebbe
fare al caso mio, ovvero io creo la tabella players come sopra,
impongo nickname NOT NULL PRIMARY KEY, e poi modifico matches in modo
che i due attributi player1 e player2 abbiano come foreign key
players(nickname)?
La sintassi del manuale mySQL non mi aiuta a risolvere il dilemma :)
Saluti, 


 Vempł

Ma non puoi inserire una colonna in piů che funga da chiave primaria
surrogata ossia un "id" numerico che si relaziona con tutte le tabelle
figlie. 
Non č molto pulito mettere come PK un campo soggetto a molte modifiche.
Vedi tu...
Saluti 
Ragno!!!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Questo e` il risultato di una veloce prova (su PostgreSQL):
fumetti=# \d aaa
Table "aaa"
Column  |         Type          | Modifiers
--------+-----------------------+-----------
player1 | character varying(20) |
player2 | character varying(20) |
p1rank  | numeric               |
p2rank  | numeric               |
fumetti=# select * from aaa;
player1  | player2 | p1rank | p2rank
---------+---------+--------+--------
pippo    | pluto   |      1 |      2
paperino | minni   |      3 |      4
(2 rows)
fumetti=# select player1, player2,
fumetti-# sum(p1rank)+sum(p2rank) as somma from aaa group
fumetti-# by player1, player2;
player1  | player2 | somma
---------+---------+-------
paperino | minni   |     7
pippo    | pluto   |     3
(2 rows)
fumetti=#
Henryx
-- 
GnuPG fingerprint = 42F9 521B 63C7 89FE 354C  89FA 4E49 3E2D 2EB6 B014

 le righe con AAA in matches cambiandolo in BBB?
Come hai appena detto, devi usare una constraint di tipo foreign key,
creando due tabelle (la prima detta di lookup, con un campo id che e`
di tipo primary key, e un campo in cui viene inserito il nome del tuo
giocatore; la seconda invece con un campo di tipo foreign key, che si
riferisce alla primary key della tabella di lookup) in cui andranno i
dati che ti interessano. La creazione della foreign key puo` avvenire
in molti modi, dalla sua definizione al momento della creazione della
tabella, all'utilizzo di un ALTER TABLE
Henryx
P.S. questa e` una delle operazioni che vengono eseguite per ottenere
la cosiddetta "integrita` referenziale"
