Newsgroup: it.comp.www.php
Titolo: Classifica da tabella partite

Salve.
Sto facendo delle prove... Ho impostato una tabella per gestire un
torneo (pallavolo).
La tabella (che ho chiamato "partite"), per ora, è di questo tipo:
 id_partite
 data
 squadra_1
 squadra_2
 risultato_1
 risultato_2
Leggendo da questa tabella come posso tirare fuori la classifica?
A pallavolo se vinci 3-0 o 3-1 prendi 3pt, se vinci 3-2 prendi 2pt e
l'altra squadra ne prende 1pt....
Mi sono ingarbugliato.... Posso fare qualcosa con questi dati? Oppure
ci vuole un'altra tabella?
Grazie....

ricc ha scritto:

Aggiungi un campo in cui indichi la squadra vincitrice e poi fai una
query di raggruppamento con COUNT() e ORDER BY conteggio DESC per
ottenere la classifica ordinata dal primo all'ultimo classificato.
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 ottenere la classifica ordinata dal primo all'ultimo classificato.
vista la regoletta dei 2 punti ci vogliono piu query per ogni squadra, ma
la strada è quella

 squadra, ma la strada è quella
Sono sufficienti due campi ed una sola query di selezione. Un campo per
indicare la squadra vincente e l'altro per indicare i punti ottenuti a
seconda del risultato della partita. La query e' pressoche' identica a
quella indicata solo che al posto di COUNT() va utilizzato SUM().


 quella indicata solo che al posto di COUNT() va utilizzato SUM().
certo, se metti anche l'altra colonna sì.

 ci vuole un'altra tabella?
Io tempo fa lo avevo fatto con soli quei dati, piu' una tabella 
classifica che aggiornavo ad ogni inserimento o modifica del risultato.
Tenendo comunque una procedura che mi ricreasse tutta la classifica in 
caso di problemi.
In pratica mi scorrevo tutta la tabella delle partite in cui c'era il 
risultato.
Cercavo quale delle due squadre era arrivata a 3, a quel punto 
controllavo l'altra, se era minore di 2, 3 punti alla prima e 0 alla 
seconda, altrimenti 2 e 1.
Poi vabbe', visto che il risultato lo ricevevo tramite SMS facevo molti 
altri controlli di coerenza dei dati, ma questo prima di inserirlo nel 
db, e non mi sarei mai immaginato cosi' tante "o" al posto di 0 ;)
Non so se e' quello che chiedevi, altrimenti chiedi pure, io lo avevo 
sviluppato in perl, ma da qualche parte dovrei avere ancora l'analisi :P
Ciao
-- 
MMM


io direi che puoi fare qualche cosa... :)
SELECT p.sq1,p.sq2,p.punt1,p.punt2,
(p.punt1-p.punt2) as differenza,
CASE p.punt1-p.punt2
  WHEN 1
    THEN 2
  WHEN -1
   THEN 1
  ELSE IF(p.punt1-p.punt2>0,3,0)
END as ptClass1,
CASE p.punt1-p.punt2
  WHEN -1
    THEN 2
  WHEN 1
   THEN 1
  ELSE IF(p.punt1-p.punt2<0,3,0)
END as ptClass2
FROM partite p
questa ti mette una colonna che indica la differenza di set vinti...
una colonna con il punteggio della squadra 1 e quello per la 2, se la
differenza è negativa ha vinto la squadra 2, se positiva la squadra 1.
Ciao Gianmarco

 differenza è negativa ha vinto la squadra 2, se positiva la squadra 1.
Ok, funziona... però la mia inesperienza non mi permette di manipolare
bene quei dati. La situazione, per esempio, è questa:
RISULTATI
SQ-UNO contro SQ-DUE     -> 3-1
SQ-TRE contro SQ-QUATTRO -> 3-2
SQ-UNO contro SQ-TRE     -> 3-0
Dovremmo avere quindi (poi l'ordinamento col DESC me le sistemerebbe)
SQ-UNO     -> 6Pt
SQ-DUE     -> 0Pt
SQ-TRE     -> 2Pt
SQ-QUATTRO -> 1Pt
Eseguendo la query che suggerisci ottengo questa tabella:
sq_a   sq_b        ris_sq_a ris_sq_b differenza ptClass1 ptClass2
SQ-UNO SQ-DUE      3        1        2          3        0
SQ-TRE SQ-QUATTRO  3        2        1          2        1
SQ-UNO SQ-TRE      3        0        3          3        0
..in cui i conti tornano bene... Però la classifica come la tiro
fuori?
Mi scuso ancora per l'ignoranza :) ...guardando sulle guide del mysql
e leggendo i vostri post ho visto che bisogna usare il COUNT e il
SUM ... ma in query così complesso non riesco ad applicarlo :(

 SUM ... ma in query cosě complesso non riesco ad applicarlo :(
vedi se ti puo' essre utile questa.
Le query sono due la seconda richiama la prima (che quindi e' una vista)
1)
Query CalpParz
select squadra_1 as squadra, 
if(risultato_1<2,0,if(risultato_1=2,1,if(risultato_2=2,2,3))) as 
Punteggio from tabella
union
select squadra_2, 
if(risultato_2<2,0,if(risultato_2=2,1,if(risultato_1=2,2,3)))
2)
Select squadra, sum(punteggio) as classifica from CalcParz group by 
squadra order by 2 desc
sostituire "tabella" con nome vero
si potrebbe fare mettendo tutto in una unica query ma il tutto diventa 
piu' confuso
Poiche c'e' la funzione if il tutto e' dipendente dal dbms. Questa per 
mysql dovrebbe funzionare. Non la ho provata.
-- 
ac
y-1=x

 squadra order by 2 desc
Nella prima query la seconda Select è diversa dalla prima... può
essere quello il motivo dell'errore (#1054 - Colonna sconosciuta
'squadra_2' in 'field list' )? ...ovviamente il nomedella colonna è
scritto giusto...
E poi un'altra cosa... come faccio a dare il nome alla prima
query? ...che nel tuo esempio si chiama CalcParz e che poi richiami
nella seconda query...

 Alessandro Cara ha scritto:
allora ti scrivo questa query, ma direi che non ci si dovrebbe
avventurare in qualche cosa di cui non si ha il controllo, non serve a
niente che io scriva questo (intendo dal punto di vista 'didattico'),
non si tratta di un problema tecnico, ma di assenza di conoscenza SQL.
Inoltre questo è un NG di php, quindi dovresti fare domande attinenti.
La query e molto complessa, cerca di capirla.
Non sempre è possibile utilizzare le viste in mysql.
Quindi ti becchi queste query innestata:
SELECT p.sq1,SUM(tot)
FROM(SELECT (r.sq1),sum(r.ptClass1) as tot
FROM (SELECT p.sq1,p.sq2,p.punt1,p.punt2,
(p.punt1-p.punt2) as differenza,
CASE p.punt1-p.punt2
  WHEN 1
    THEN 2
  WHEN -1
   THEN 1
  ELSE IF(p.punt1-p.punt2>0,3,0)
END as ptClass1,
CASE p.punt1-p.punt2
  WHEN -1
    THEN 2
  WHEN 1
   THEN 1
  ELSE IF(p.punt1-p.punt2<0,3,0)
END as ptClass2
FROM partite p ) r
GROUP BY r.sq1
UNION
SELECT (q.sq2),sum(q.ptClass2) as tot
FROM (SELECT p.sq1,p.sq2,p.punt1,p.punt2,
(p.punt1-p.punt2) as differenza,
CASE p.punt1-p.punt2
  WHEN 1
    THEN 2
  WHEN -1
   THEN 1
  ELSE IF(p.punt1-p.punt2>0,3,0)
END as ptClass1,
CASE p.punt1-p.punt2
  WHEN -1
    THEN 2
  WHEN 1
   THEN 1
  ELSE IF(p.punt1-p.punt2<0,3,0)
END as ptClass2
FROM partite p ) q
GROUP BY q.sq2) p
GROUP BY p.sq1;
Ciao Gianmarco

 Inoltre questo è un NG di php, quindi dovresti fare domande attinenti.
Mi sapresti mica dire in quale ng (in italiano) potrei rivolgermi per
parlare di query?
Ho provato su free.it.comp.database.mysql ma non mi pare molto
popolato...
Con la classifica credo di aver risolto ma ho altre domande (non
legate al php, ma al mysql)...
Ciao e grazie ancora ...

 Ciao e grazie ancora ...
Figurati, se ho un po' di tempo mi fa piacere dare una mano, anche se
a volte mi scappa la paternale.
Ciao Gianmarco

 parlare di query?
in questi due puoi provare.
microsoft.public.it.office.access
it.comp.appl.access
Sono abbastanza frequentati.
Lì trattano fondamentalmente sqlserver e jet (access) ma non sono 
particolarmente "talebani". I.e. si incazzano relativamente per gli OT e 
c'e' comunque parecchia gente che usa mysql o qualsiasi altro dbms.
P.S. Non ti ho risposto perche' nel frattempo ho visto che Gianmarco ti 
aveva dato una/la soluzione.
-- 
ac
y-1=x