2009-05-29 7 views
5

J'ai essayé de nombreuses façons de résoudre ce problème à partir de ce forum et de beaucoup d'autres. Je n'arrive pas à trouver une solution à ce problème ou une documentation qui me donnera une réponse directe.MySQL: Comment combiner plusieurs requêtes SELECT, en utilisant différents critères WHERE sur la même table?

Je me demandais si vous pouviez y jeter un coup d'oeil.

Merci

PROBLÈME:

J'ai une base de données avec les tableaux suivants participant_scores ligues tours

Je suis actuellement en mesure d'afficher les scores d'un seul tour , un tour à la fois ... ce qui est exactement ce que je veux. Mais je veux aussi afficher le score que chaque participant a obtenu pour tous les tours. Disons que nous avons 2 tours. Je veux la sortie sur mon écran de résultats pour ressembler à ceci:

Currently viewing league 20, Round 1 
of 2: 

User Name | Score | Total Score 

Tom  | 10  | 200 

James  | 50  | 300 

nom d'utilisateur - le nom du participant score = le score de ce tour en cours score total = tous les scores ronds pour cette ligue totalisées.

Ma requête mysql est ci-dessous. Toutes mes excuses pour la confusion, je l'ai réécrit environ 100 fois et cette façon actuelle est la seule qui fonctionne pleinement.

>> 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 

Répondre

7

Qu'est-ce que vous voulez ici est une sous-requête sous cette forme:

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 sous-requête en tant que colonne sera calculée pour chaque ligne que vous revenez de votre requête initiale.

Pour essayer de l'ajouter dans votre requête:

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 

j'étais un peu inquiet au sujet de la sous-requête, y compris plusieurs ligues, mais il ressemble à un seul participant ne peut appartenir à une ligue de toute façon. Vous devrez peut-être inclure quelque chose dans la sous-requête pour vérifier cela.

+0

Bonjour, Merci pour votre réponse en profondeur. Je dois vous faire savoir que je suis un débutant et tout cela est un essai et une erreur pour moi. J'utilise un programme pour m'aider à identifier les erreurs sur mon code, mais jusqu'à présent, je n'ai pas réussi à faire fonctionner mon script avec les changements que vous avez suggérés. Je dois entrer mal. Il ne me laissera pas poster mon code ici encore. Il ne me reste que 240 caractères ... Je vais le mettre dans une réponse ci-dessous. Merci! – Tom

+0

Aussi, j'aimerais noter que les participants peuvent être membres de plusieurs ligues. Il se peut donc que nous devions essayer de mettre du code pour ne choisir que les participants qui font partie de cette ligue. - Je peux construire ce script si vous pouvez me donner une longueur d'avance. Merci encore !! – Tom

Questions connexes