Unione query di 4 tabelle

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

Tommy03

Utente Attivo
6 Giu 2018
614
58
28
21
Vicenza
Salve, avrei un problema che per me è davvero troppo complicato.
Ho queste 6 tabelle:
-user(userid,...)
-eventi(eventid,...)
-puntate(eventid,userid,coin,orario,vinta...)
-schedine(id_schedina,costo,inizio,conclusa...)
-schedine_giocate(id_schedina,userid,when,...)
-sfide(id_sfida,sfidato,sfidante,puntata,inizio,stato,...)
(Tutti questi campi sono INT, tranne "vinta","conclusa" e "stato")
Funziona così:
1.un utente con userid x quando gioca su un evento con eventid y si inserisce una riga nella tabella puntate con eventid=y,userid=x,coin è il numero di monete virtuali che ha deciso di puntare,orario è il timestamp di quando ha puntato, vinta è "forse" se la partita non è ancora conclusa, "si" se ha indovinato il risultato, "no" se l'ha sbagliato.
2.inserisco con un form delle righe nella tabella schedine (si crea un id_schedina, costo e inizio li scelgo io, conclusa può essere "si" o "no" a seconda che sia finita o meno.
3.un utente decide di puntare una schedina, spendendo il "costo" preso dalla tabella schedine. La sua giocata si inserisce in schedine_giocate(id_schedina è quello della schedina giocata, userid è il suo userid e when è il timestamp di quando ha giocato).
4.un utente può decidere di sfidare un proprio amico. In questo caso si inserisce in "sfide": id_sfida è l'ID della sfida, sfidante è il userid dell'utente che ha inviato la proposta di sfida, sfidato è l'userid dell'utente che ha ricevuto la proposta di sfida, puntata è l'importo di monete virtuali da puntare(scelto dallo sfidante), inizio è il timestamp dell'orario di inizio degli eventi associati alla sfida, stato può essere "richiesta" se la proposta non è ancora stata accettata, "rifiutata", "incorso", se è stata accettata, "conclusa", se tutti gli eventi sono già finiti.

Detto questo, spero che la panoramica sia chiara. Quello che vorrei fare è:
In una pagina sono riuscito a calcolare la somma totale dei coins in gioco di un determinato utente(somma da puntate, schedine_giocate e sfide). Ora mi piacerebbe visualizzare un box per ogni "elemento" in gioco di quel determinato. Un esempio:
Box 1 (puntata): orario - Hai puntato <coin> monete sull'evento <eventid>
Box 2 (schedine_giocate): when - Hai puntato <schedina.costo> monete sulla schedina <id_schedina>
Box 3 (sfida): inizio - Hai <puntata> coins in gioco in una sfida contro <sfidato o sfidante a seconda di chi ha creato la sfida>
...
Ovviamente per creare i box mi arrangio, mi serve un aiuto per recuperare i dati dal database
Spero di essermi spiegato, credo che bisogni utilizzare le UNION per fare ciò ma non sono pratico, qualcuno può aiutarmi?
 
Ultima modifica:
Con enorme soddisfazione posso dire di esserci riuscito!! Sono davvero stupito di me stesso perchè fino a ieri le mie conoscenze di SQL si fermavano ai WHERE... e non avevo mai preparato query più "complesse"
Se a qualcuno servisse per uno spunto pubblico la query funzionante:
PHP:
SELECT events.eventid,events.sport,events.description,puntate.coin,events.inizio,CONCAT('evento') AS tipo FROM events LEFT JOIN puntate ON puntate.eventid=events.eventid WHERE puntate.userid='$usid' AND events.finito='no' UNION SELECT schedine.id_schedina AS eventid,sport AS sport,titolo AS description,costo AS coin,inizio AS inizio,CONCAT('schedina') AS tipo FROM schedine LEFT JOIN schedine_giocate ON schedine_giocate.id_schedina=schedine.id_schedina WHERE schedine_giocate.userid='$usid' AND schedine.conclusa='no' UNION SELECT id_sfida AS eventid,sfidato AS sport,sfidante AS description,puntata AS coin,inizio AS inizio,CONCAT('sfida') AS tipo FROM sfide WHERE (sfidante='$usid' OR sfidato='$usid') AND stato='conclusa'
ORDER BY inizio DESC
 

Discussioni simili