Unire dati da due tabelle

Tommy03

Utente Attivo
6 Giu 2018
361
39
28
16
Bassano del Grappa (VI)
Salve, ho un nuovo problema.
Ho queste tabelle:
-users(userid,...)
-puntate(userid,eventid,quota,vinta,...)
-events(eventid,sport,...)
In questo modo per ogni utente calcolo il suo punteggio (numero_vittorie * media_quota * (numero_vittorie / puntate_totali))
PHP:
SELECT userdat.userid, ((SELECT COUNT(*) AS vinte FROM puntate WHERE puntate.userid = userdat.userid AND vinta='si')*(SELECT AVG(quota) AS media FROM puntate WHERE puntate.userid = userdat.userid AND vinta='si')*(SELECT COUNT(*) AS vinte FROM puntate WHERE puntate.userid = userdat.userid AND vinta='si') / (SELECT COUNT(*) AS numero FROM puntate WHERE puntate.userid = userdat.userid)) AS punteggio FROM puntate LEFT JOIN userdat ON userdat.userid = puntate.userid GROUP BY userdat.userid ORDER BY punteggio DESC
Con questa query ottengo giustamente come risultato ogni utente associato al suo punteggio. Mi piacerebbe modificare questa query in modo da aggiungere un filtro per eseguire lo stesso calcolo soltanto per un determinato sport (le puntate sono riferite ad un evento con determinato eventid, e ogni evento ha uno sport associato)
Ad esempio:
PHP:
switch($sport){
case 'football' :
$where = "/* cosa devo scrivere qui? */";
break;
case 'tennis' :
$where = "/* cosa devo scrivere qui? */";
break;
...
}
Quindi come faccio a scegliere le puntate di un evento di un determinato sport?
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.233
321
83
dai un occhio qui
 

Tommy03

Utente Attivo
6 Giu 2018
361
39
28
16
Bassano del Grappa (VI)
Grazie mille per la risposta, ma il mio problema non riguarda UNION, credo che dovrei usare LEFT JOIN o WHERE per collegare i dati ma non so come usarli.
Grazie comunque per la risposta
 

Tommy03

Utente Attivo
6 Giu 2018
361
39
28
16
Bassano del Grappa (VI)
Momentaneamente, per comodità, anche se non sarebbe proprio corretto, ho aggiunto direttamente un campo "sport" anche nella tabella puntate, e vi inserisco lo sport in fase di inserimento senza complicarmi troppo la vita in fase di selezione e mettendo quindi un semplice where. Ovviamente, anche se ho già raggiunto il mio scopo, se qualcuno riuscisse comunque ad aiutarmi mi farebbe un grande favore.
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
questa query dovrebbe essere equivalente alla tua,
ho controllato e non ci sono errori ortografici, ma dimmi se funziona,
SQL:
SELECT t.userid, u.nome, sum(t.vinte) * sum(t.vinte) * sum(t.media) / sum(t.numero) AS punteggio FROM (
  SELECT userid, COUNT(*) AS vinte, AVG(quota) AS media, 0        AS numero FROM puntate WHERE vinta='si' GROUP BY userid
  UNION ALL
  SELECT userid, 0        AS vinte, 0          AS media, COUNT(*) AS numero FROM puntate                  GROUP BY userid
) t
LEFT JOIN users u ON t.userid = u.userid
GROUP BY t.userid, u.nome
ORDER BY punteggio DESC, u.nome
se per caso la precedente funzionasse, magari può andare anche questa
SQL:
SELECT t.userid, u.nome, t.sport, sum(t.vinte) * sum(t.vinte) * sum(t.media) / sum(t.numero) AS punteggio FROM (

  SELECT userid, sport, COUNT(*) AS vinte, AVG(quota) AS media, 0        AS numero
  FROM puntate p
  LEFT JOIN sport s ON p.eventid = s.eventid AND sport = 'xyz'
  WHERE vinta='si'
  GROUP BY userid, sport

  UNION ALL

  SELECT userid, sport, 0        AS vinte, 0          AS media, COUNT(*) AS numero
  FROM puntate p
  LEFT JOIN sport s ON p.eventid = s.eventid AND sport = 'xyz'
  GROUP BY userid, sport

) t
LEFT JOIN users u ON t.userid = u.userid
GROUP BY t.userid, u.nome, t.sport
ORDER BY punteggio DESC, u.nome
mi riprometto di verificare se esiste di meglio,
per gestire 2 livelli di "group by" nella stessa query,
in una forma portabile su sistemi diversi
 
Ultima modifica:

Tommy03

Utente Attivo
6 Giu 2018
361
39
28
16
Bassano del Grappa (VI)
Marino51 sei favoloso, non so come ringraziarti. Funzionano entrambe perfettamente, sento che grazie ai tuoi consigli mi viene sempre più facile capire cose che fino a poco tempo fa mi sembravano impossibili!
Grazie mille