Select in ordine per numero di record

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
17
Vicenza
Salve, ho una tabella "sfide" con questi campi:
-sfidante (INT, contiene l'id dell'utente che ha lanciato la sfida)
-sfidato (INT, contiene l'id dell'utente che ha accettato la sfida)
-vincente (INT, contiene l'id dell'utente che ha vinto la sfida)

Ciò che devo fare pensavo fosse banale ma per me non lo è. In pratica vorrei per un determinato utente che visita il sito (con ID = x) che vedesse l'avversario con cui ha avuto il maggior numero di vittorie, il problema è che x può essere sia "sfidante" che "sfidato". Qualcuno sa aiutarmi?
P.S. se serve c'è anche un'altra tabella ("users") che contiene gli id di tutti gli utenti.
Grazie
 

IClaude

Nuovo Utente
30 Mag 2020
9
0
1
credo che tu debba fare select count di select count ... e così via ... select nidificate ...
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
17
Vicenza
Grazie, ci ho provato, ma il problema è che l'avversario può essere sia nel campo "sfidante" che "sfidato" e quindi non so quale prendere
 

marino51

Utente Attivo
28 Feb 2013
3.016
174
63
Lombardia
non so se ho capito bene, provo a darti un suggerimento come costruire la query,

"utente che visita il sito (con ID = x) che vedesse l'avversario con cui ha avuto il maggior numero di vittorie"

tutti gli avversari li chiamiamo y per comodità,

ora selezioniamo i record con sfidante = x (alias X) e sfidato (alias Y) e inseriamoci un CASE WHEN (ricordi ?)
ovvero se sfidante = vincente restituisce 1 altrimenti 0 (alias RISULTATO)

UNION

ora selezioniamo i record con sfidato = x (alias X) e sfidante (alias Y) ed inseriamoci il CASE WHEN
ovvero se sfidato = vincente restituisce 1 altrimenti 0 (alias RISULTATO)

a questo punto abbiamo un set con X = sfidante/sfidato, Y = sfidato/sfidante e risultato = 1 / 0 se X ha vinto o perso

select su questo set di X, Y e somma(risultato) raggruppato per X e Y e ordinato per la somma decrescente

dovrebbe essere tutto,
 
Ultima modifica:

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
17
Vicenza
Ciao Marino,
prima di tutto ti illustro i record che ci sono dentro alla tabella:
tab1.png

Quindi per l'utente con id=78593169600496 ci sono 6 vittorie (con 4 avversari diversi) e 2 pareggi (indicati con 111)

Ho provato con questa query:
PHP:
SELECT sfidante as x, sfidato as y, CASE WHEN sfidante = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidante = 78593169600496
UNION 
SELECT sfidato as x,sfidante as y, CASE WHEN sfidato = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidato = 78593169600496
E mi restituisce così:
tab2.png

Quindi per i pareggi mi da correttamente 0, per le vittorie mette 1 per ciascuno utente, anche ai due avversari con cui ha vinto 2 volte.

ora selezioniamo i record con sfidante = x (alias X) e sfidato (alias Y) e inseriamoci un CASE WHEN (ricordi ?)
ovvero se sfidante = vincente restituisce 1 altrimenti 0 (alias RISULTATO)

UNION

ora selezioniamo i record con sfidato = x (alias X) e sfidante (alias Y) ed inseriamoci il CASE WHEN
ovvero se sfidato = vincente restituisce 1 altrimenti 0 (alias RISULTATO)
Fino a qui quindi ho capito, ma non mi viene la parte finale.
Come posso procedere?
Grazie ancora
 

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
17
Vicenza
Aggiornamento, nel frattempo penso di essere riuscito a fare la parte finale che mi hai suggerito, raggruppando per avversario e sommando le vittorie, così:
PHP:
SELECT y,SUM(vittoria) FROM
(SELECT sfidante as x, sfidato as y, CASE WHEN sfidante = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidante = 78593169600496
UNION
SELECT sfidato as x,sfidante as y, CASE WHEN sfidato = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidato = 78593169600496)
AS z GROUP BY y
E lo fa correttamente, però rimane sempre il problema che per la query del post precedente i risultati "doppi" non me li considera, e quindi vedo solo una vittoria anche contro gli avversari con cui ha vinto 2 volte.

Inoltre, tornando alla questione precedente (che mi riporta solo una riga per ogni avversario con cui ha vinto 2 volte) ho visto che se uso questa query (senza UNION, soltanto dove sfidante = x) me li prende tutti correttamente:
PHP:
SELECT sfidante as x, sfidato as y, CASE WHEN sfidante = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidante = 78593169600496
Veramente non capisco perché quando faccio la UNION mi elimina i duplicati
 
Ultima modifica:

Tommy03

Utente Attivo
6 Giu 2018
606
57
28
17
Vicenza
RISOLTO!!! Grazie mille marino51, ho tentato (a caso) a mettere UNION ALL al posto di UNION e funziona.
Pubblico la query totale se dovesse servire a qualcuno:
PHP:
SELECT y,SUM(vittoria) AS num_vittorie FROM
(SELECT sfidante as x, sfidato as y, CASE WHEN sfidante = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidante = 78593169600496
UNION ALL
SELECT sfidato as x,sfidante as y, CASE WHEN sfidato = vincente THEN 1 ELSE 0 END AS vittoria FROM sfide WHERE sfidato = 78593169600496)
AS z GROUP BY y ORDER BY num_vittorie DESC
Senza il tuo aiuto non ce l'avrei mai fatta, grazie ancora!
 
Discussioni simili
Autore Titolo Forum Risposte Data
L problema con query select PHP 2
F menù select dinamico da db in php PHP 3
D popolare campi tra th alla select PHP 36
M Estrarre valore con SELECT COUNT PHP 0
M Creare un campo input select quantità di un numero intero prelevato dal db PHP 3
L Select Dinamiche...da txt? PHP 3
E Php select option e ajax PHP 23
R Select concatenata che non funziona la seconda volta Ajax 3
L select join e sottrazione punti PHP 13
L input dati con inser into select ? PHP 4
V hierarchy-select jQuery 0
Emix Select concatenate php sql ajax PHP 2
F query e form con select multipla PHP 17
T recupero valori select multipla da android Javascript 3
J php, scegliere autista da select e mostrare se ha fatto un incidente PHP 8
T problema con select dinamica con jquery Javascript 0
J Far comparire e scomparire un div con un select Javascript 1
M Opzioni select da 1 a 200 PHP 0
C input in sostituzione della select PHP 2
G Insert into select - Aiuto MySQL 0
max1974 autocomplete trigger select jQuery 0
X [Select] Valori chiave non presenti in un'altra tabella MySQL 2
M Estrarre dati da una select HTML PHP 3
MarcoGrazia jquery validate, necessità di validare almeno un elemento select su due jQuery 1
T [PHP] Autocompilazione input multiple da una select PHP 1
Alex_70 [PHP] Visualizzare foto tramite select PHP 0
S [PHP] aggiornamento table tramite select senza ricaricare la pagina PHP 5
psicomia Gestione funzione in javascript in tabella richiamare"textarea" valori preimpostati in "select" Javascript 2
M [PHP] Problema con query select PHP 2
C [PHP] Controllo <select> comportamento anomalo PHP 2
G [PHP] Select con opzioni dipendenti da un'altra select PHP 3
L [Javascript] Select option in campi input Javascript 4
M [PHP] Problemi con select PHP 6
S [RISOLTO] aggiorna tabella da select option asp classic Classic ASP 7
S [ASP] SALVARE VALORE SELECT OPTION SU CAMPO TABELLA ACCESS Classic ASP 9
max1974 [Javascript] malfunzionamento select Javascript 0
M [PHP] Drop down in campo select PHP 1
D [PHP] Select dinamici PHP 2
G sql select con array in php PHP 1
L [PHP] Form da select compilare campi automaticamente PHP 1
T [php] problema creazione query select-where PHP 5
Monital [PHP] query update e select insieme ma frazionando l'arrray PHP 12
G [Javascript] Campo a comparsa di select Javascript 0
S [PHP] restituire intera frase da una select PHP 7
A [PHP] select a cascata regione province e comuni PHP 5
maxnegri Sommare i prezzi dei prodotti aggiunti al carrello di diverse aziende con Select sum php mysqli PHP 10
A [PHP] Errore select dati da db PHP 0
maxnegri [PHP] Eliminare risultati duplicati da ciclo foreach ottenuti da una select php mysqli PHP 18
S [WordPress] Creare una select box con partita iva e codice fiscale in base a una logica. WordPress 0
G [ASP] Incrementare un valore on the fly su selezione select Classic ASP 3

Discussioni simili