Unire dati da due tabelle

  • Creatore Discussione Creatore Discussione Tommy03
  • Data di inizio Data di inizio

Tommy03

Utente Attivo
6 Giu 2018
614
58
28
21
Vicenza
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?
 
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
 
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.
 
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:
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
 

Discussioni simili