Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    25

    [mySql] Doppio Join con stessa tabella

    Ho un piccolo (si fa per dire) problema con una query in cui dovrei fare un doppio Join sulla stessa tabella. Per farla semplice, ho 2 tabelle:

    iscrizioni_coppie
    |id|giocatore_1|giocatore_2|
    |1|Pippo|Pluto|
    |2|Paperino|Paperone|

    classifica
    |anno|week|giocatore|punti
    |2015|1|Paperino|200
    |2015|1|Pippo|100
    |2015|1|Paperone|50
    |2015|2|Paperino|300
    |2015|2|Pippo|150
    |2015|2|Paperone|50
    |2015|2|Pluto|40

    Dovrei ordinare le coppie (giocatore 1 e giocatore 2) iscritte in iscrizioni_coppie, in base alla somma decrescente dei punti dei 2 giocatori che la compongono per una data settimana di un dato anno prelevati, ovviamente dalla tabella classifica.

    Sono riuscito a tirar fuori qualcosa che funziona solo quando entrambi i giocatori di una coppia compaiono in classifica (quindi nell'esempio in corrispondenza della week 2 del 2015) mentre non riesco a farlo funzionare nel caso in cui uno o più giocatori non siano in classifica nella settimana scelta (caso della week 1 dove Pluto non è presente in classifica in quella settimana)

    Questo è quanto ho fatto:
    Codice PHP:
            SELECT i.*,c.*,c2.*, c1.punti+c2.punti AS punti_coppia
            FROM iscrizioni_coppie 
    AS i
            JOIN classifica 
    AS c ON i.giocatore_1=c.giocatore
            JOIN classifica 
    AS c2 ON i.giocatore_2=c2.giocatore
            WHERE c
    .week='$week' AND c.anno='$anno' AND
            
    c2.week='$week' AND c2.anno='$anno'
            
    ORDER BY punti_coppia DESC 
    Ho provato a mettere anche il LEFT JOIN in modo da restituirmi tutte le righe della tabella iscrizioni_coppie che non trovano corrispondenza sulla tabella classifica, ma niente, mi restituisce solo le righe in cui entrambi i giocatori sono presenti nella classifica in quella settimana.
    Mi affido alla vostra esperienza, sicuramente maggiore della mia

  2. #2
    SELECT i.*,c1.*,c2.*, ISNULL(c1.punti,0)+ISNULL(c2.punti,0) AS punti_coppia
    FROM iscrizioni_coppie
    AS i
    LEFT JOIN classifica
    AS c1 ON i.giocatore_1=c1.giocatore AND c1.week='$week' AND c1.anno='$anno'
    LEFT JOIN classifica
    AS c2 ON i.giocatore_2=c2.giocatore AND c2.week='$week' AND c2.anno='$anno'
    ORDER BY punti_coppia DESC

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    25
    Perfetto, in pratica bisognava inserire le clausole direttamente nei due LEFT JOIN piuttosto che nella WHERE, con l'aggiunta del controllo del campo punti e farlo valere 0 nei casi in cui sia NULL. Grazie mille!

  4. #4

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    25
    Quote Originariamente inviata da optime Visualizza il messaggio
    optime!
    Ho dovuto solo cambiare ISNULL con IFNULL perchè, se non ho capito male ISNULL non esiste in MySQL, comunque ancora grazie, non ci sarei arrivato da solo in tempi umani

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.