Classifica

  • Creatore Discussione Creatore Discussione edoo
  • Data di inizio Data di inizio

edoo

Nuovo Utente
8 Ago 2013
21
0
0
ciao a tutti ho l'esigenza di creare una classifica per una gara, nella classifica possono apparire solo gli utenti che si sono registrati al sito, quelli non registrati no
io ho 2 tabelle:
la tabella classifica con la lista delle persone registrate e non con nome cognome e punteggio
e la tabella utenti registrati: dove ci sono i campi nome cognome user che l'utente dovrà inserire...
come faccio a mostrare solo gli utenti che si sono registrati della tabella classifica??
ho provato a fare così ma credo sia sbagliato, io volevo confrontare il nome dell'utente della tabella classifica con quello della tabella utenti registrati, se lo trovava mi mostrava il nome e gli altri dati...
PHP:
<?php if($row_RS_classifica['nome']== $row_RS_utenti_reg['nome']) {?>
                        <td><?php echo $row_RS_classifica['posizione']; ?>°</td>
                        <td class="user-name">
<?php echo $row_RS_classifica['nome'] ?> <?php echo $row_RS_classifica['cognome']; ?>
                    </td>
                        

                        <td class="user-punti"><?php echo $row_RS_classifica['punti']; ?>
                          </td>
 
la prima cosa da impostare è la query che seleziona gli elementi dal database, che può essere,
Codice:
select 
  utenti_registrati.nome
 ,utenti_registrati.cognome
 ,classifica.punteggio
 ,classifica.posizione
from utenti_registrati, classifica
where classifica.cognome=utenti_registrati.cognome
and   classifica.nome=utenti_registrati.nome
order by classifica.posizione, classifica.punteggio, utenti_registrati.cognome, utenti_registrati.nome

a questo punto imposti la lettura del database,
e facendoti restituire una riga per volta, ottieni la lista

potrebbe andare anche come hai scritto tu, sistemando il codice, ma è una via più laboriosa e critica
perchè devi pareggiare le letture dalle due tabelle
mentre, se ti va bene, la select soprastante ti restituisce gli elementi già pareggiati
ciao
Marino
 
Grazie mille ora funziona sei stato gentilissimo :fonzie:
Se ti posso chiedere un'ultima cosa, riguardante la posizione in classifica, la devo sempre aggiornare io o c'è un modo per calcolarla in base al punteggio dell'utente? ancora grazie
 
la posizione in classifica, la devo sempre aggiornare io o c'è un modo per calcolarla in base al punteggio dell'utente?

attento, la mia prova è stata fatta con MS SQL,

questa è l'update,

Codice:
UPDATE classifica
SET [posizione] = t2.[posizione]
FROM classifica t1
LEFT OUTER JOIN 
(
  SELECT
    nome
  , cognome
  , punti
  , Rank() OVER (ORDER BY punti desc) as [posizione]
  FROM classifica
) as t2 
  ON t1.nome = t2.nome
  AND t1.cognome = t2.cognome

io l'ho provata così,

Codice:
DECLARE @classifica TABLE
(
nome nvarchar(100),
cognome nvarchar(100),
punti int,
[posizione] int
)

INSERT INTO @classifica VALUES('Paolo',  'Settimo',            1, -1)
INSERT INTO @classifica VALUES('Luca',   'Sesto',             11, -1)
INSERT INTO @classifica VALUES('Luigi',  'Quinto',            13, -1)
INSERT INTO @classifica VALUES('Andrea', 'Terzo pari merito', 16, -1)
INSERT INTO @classifica VALUES('Sonia',  'Terza pari merito', 16, -1)
INSERT INTO @classifica VALUES('Luisa',  'Seconda',           17, -1)
INSERT INTO @classifica VALUES('Anna',   'Prima',             18, -1)

UPDATE @classifica
SET [posizione] = t2.[posizione]
FROM @classifica t1
LEFT OUTER JOIN 
(
  SELECT
    nome
  , cognome
  , punti
  , Rank() OVER (ORDER BY punti desc) as [posizione]
  FROM @classifica
) as t2 
  ON t1.nome = t2.nome
  AND t1.cognome = t2.cognome

SELECT posizione, punti, nome, cognome from @classifica order by posizione

e questo è il risultato

1 18 Anna Prima
2 17 Luisa Seconda
3 16 Andrea Terzo pari merito
3 16 Sonia Terza pari merito
5 13 Luigi Quinto
6 11 Luca Sesto
7 1 Paolo Settimo

fammi sapere se update va bene con mysql
ciao
Marino
 
Ciao, scusa, ieri non sono riuscito a provare il codice che mi hai dato, oggi lo faccio e ti dico, grazie
 
sinceramente non riesco a farlo funzionare, da phpmyadmin ci provo ma mi restituisce questo errore
Codice:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM utenti t1 LEFT OUTER JOIN ( SELECT nome , cognome , punti ' at line 3

UPDATE utenti
SET posizione = t2.posizione
FROM utenti t1
LEFT OUTER JOIN 
(
  SELECT
    nome, cognome, punti, Rank() OVER (ORDER BY punti desc) as posizione
  FROM utenti
) as t2 
  ON t1.nome = t2.nome
  AND t1.cognome = t2.cognome
ma probabilmente è colpa mia non sono molto pratico, Grazie comunque
 
penso che il codice non sia compatibile con mysql,

ho pensato ad un secondo modo, che dovrebbe essere a prova di mysql,
non fa update perché non ho potuto provarlo,
esegui tutto come unico codice (è solo select, non rovina nulla)
e fammi sapere se calcola bene la posizione
ciao
Marino

ps, punti deve essere maggiore di, o uguale a zero !

Codice:
set @con =0,
set @pos =1;
set @pun =-1;
SELECT  nome,
        cognome,
        punti,
        posizione
FROM
(
  SELECT  nome,
          cognome,
          punti,
          @con := @con+1,
          @pos := if(@pun=punti, @pos, @con) as posizione,
          @pun := punti     
  FROM
  (
    SELECT  nome,
            cognome,
            punti,
    FROM    utenti
    ORDER BY punti DESC, cognome, nome
) A
) B;
 
Ultima modifica:

Discussioni simili