2009-05-29 12 views
5

Ho provato molti modi diversi per risolvere questo problema da questo forum e da molti altri. Non riesco a trovare una soluzione a questo problema o alcuna documentazione che mi dia una risposta diretta.MySQL: Come combinare più query SELECT, utilizzando diversi criteri WHERE sulla stessa tabella?

Mi chiedevo se potessi dargli un'occhiata.

Grazie

IL PROBLEMA:

Ho un database con le seguenti tabelle participant_scores leghe turni

Sono attualmente in grado di visualizzare i punteggi di un singolo round , un giro alla volta ... che è esattamente come lo voglio. Ma voglio anche mostrare il punteggio ottenuto da ogni partecipante per tutti i round. Diciamo che abbiamo 2 turni. Voglio che l'output sul mio schermo risultati a guardare qualcosa di simile:

Currently viewing league 20, Round 1 
of 2: 

User Name | Score | Total Score 

Tom  | 10  | 200 

James  | 50  | 300 

nome utente - del partecipante punteggio nome = il punteggio per questo attuale ciclo punteggio totale = tutte le rotonde punteggi per questo campionato sommati.

La mia domanda Mysql è qui sotto. Mi scuso per il disordine, l'ho riscritto circa 100 volte e questo modo attuale è l'unico modo che funziona pienamente.

>> league_participants_query (mysql)

# FIELDS 
    SELECT  
     participants.participant_id,           # ID - used for functions 
     participants.participant_name,          # NAME 
     participants.participant_gender,          # Participant info    
     classes.class_name,             # Class name 
     schools.school_name,             # School name 
     participant_scores.participant_score,         # Participant score 
     participant_scores.participant_score_id 



    # TABLES 
    FROM   participant_scores, participants, classes, league_schools, schools, leagues, rounds  


    # filter leagues 
    WHERE  leagues.league_id    =  51 

    AND   rounds.league_id    =  51 # the current league we are viewing 
    AND   rounds.round_id     =  25 # the current round of the league we are viewing 

    # filter league schools 
    AND   participant_scores.round_id  =  25 # the current round of the league we are viewing 

    # filter schools allowed 
    AND   league_schools.league_id  =  51 # the current league we are viewing 

    # Filter schools 
    AND   schools.school_id    =  league_schools.school_id 

    # Filter classes 
    AND   classes.school_id    =  schools.school_id           
    AND   classes.year_group_id   =  leagues.year_group_id 

    # Filter participants 
    AND   participants.class_id   =  classes.class_id 

    # Filter participant_scores 
    AND   participant_scores.participant_id =  participants.participant_id 

    #Grouping 
    GROUP BY  participants.participant_id 

risposta

7

Quello che vuoi: ecco un subquery in questa forma:

SELECT 
    name, 
    round, 
    score, 
    (select sum(score) from scores sc where sc.userid = users.userid) total 
FROM users INNER JOIN scores on users.userid = scores.scoreid 

La sottoquery come una colonna verrà calcolato per ogni riga si torna dalla tua query iniziale.

Per tentare di aggiungere nella tua query:

SELECT 
    participants.participant_id, 
    participants.participant_name, 
    participants.participant_gender, 
    classes.class_name, 
    schools.school_name, 
    participant_scores.participant_score, 
    participant_scores.participant_score_id, 
    (SELECT sum(participant_score) FROM participant_scores tbl_scores2 
    WHERE tbl_scores2.participant_score_id = participants.participant_id) total 
FROM participant_scores, participants, classes, 
    league_schools, schools, leagues, rounds 
WHERE 
    leagues.league_id = 51 AND 
    rounds.league_id = 51 AND 
    rounds.round_id = 25 AND 
    participant_scores.round_id = 25 AND 
    league_schools.league_id = 51 AND 
    schools.school_id = league_schools.school_id AND 
    classes.school_id = schools.school_id AND 
    classes.year_group_id = leagues.year_group_id AND 
    participants.class_id = classes.class_id AND 
    participant_scores.participant_id = participants.participant_id 
GROUP BY 
    participants.participant_id 

ero un po 'preoccupato per la sottoquery tra cui più campionati, ma sembra che un singolo partecipante può appartenere solo a un campionato comunque. Potrebbe essere necessario includere qualcosa nella subquery per verificarlo.

+0

Ciao, grazie per la tua risposta approfondita. Devo farti sapere che sono un principiante e tutto questo è stato per me prova ed errore. Sto usando un programma per aiutarmi a identificare gli errori sul mio codice, ma finora non sono riuscito a far funzionare il mio script con le modifiche suggerite. Devo entrare in loro sbagliando. Non mi permette di postare di nuovo il mio codice qui. Ho solo 240 caratteri rimasti ... Lo metterò in una risposta qui sotto. Grazie! – Tom

+0

Inoltre, vorrei sottolineare che i partecipanti possono essere membri di molti campionati. Quindi dovremmo provare a inserire un codice per scegliere solo i partecipanti che fanno parte di questo campionato. - Posso costruire quella sceneggiatura se tu potessi darmi un vantaggio. Grazie ancora !! – Tom

Problemi correlati