2009-05-29 16 views
5

He estado intentando muchas formas diferentes de resolver este problema desde este foro y desde muchos otros. Parece que no puedo encontrar una solución a este problema o cualquier documentación que me dé una respuesta directa.MySQL: ¿Cómo combinar múltiples consultas SELECT, usando diferentes criterios WHERE en la misma tabla?

Me preguntaba si podría echarle un vistazo.

Gracias

EL PROBLEMA:

Tengo una base de datos con las siguientes tablas participant_scores ligas rondas

Actualmente soy capaz de mostrar los resultados de una sola ronda , una ronda a la vez ... que es exactamente como lo quiero. Pero también quiero mostrar el puntaje que obtuvo cada participante en todas las rondas. Digamos que tenemos 2 rondas. Quiero la salida en mi pantalla de resultados para buscar algo como esto:

Currently viewing league 20, Round 1 
of 2: 

User Name | Score | Total Score 

Tom  | 10  | 200 

James  | 50  | 300 

nombre de usuario - puntuados Nombre del participante = la puntuación para esta puntuación actual ronda Total = todas las puntuaciones redondas de esta Liga sumarse.

Mi consulta Mysql está por debajo. Disculpas por su desorden, lo reescribí unas 100 veces y esta forma actual es la única que funciona completamente.

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

Respuesta

7

Lo que se quiere aquí hay una subconsulta en esta 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 subconsulta como una columna se calculará para cada fila regrese de su consulta inicial.

Para tratar de agregarlo a su consulta:

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 

que estaba un poco preocupado por la subconsulta que incluye múltiples ligas, pero parece que un solo participante sólo puede pertenecer a una liga de todos modos. Es posible que deba incluir algo en la subconsulta para verificar esto.

+0

Hola, gracias por su respuesta en profundidad. Tengo que decirte que soy un principiante y todo esto es prueba y error para mí. Estoy usando un programa para ayudarme a identificar errores en mi código, pero hasta ahora no he podido hacer que mi script se ejecute con los cambios sugeridos. Debo estar ingresándolos mal. No me deja publicar mi código aquí de nuevo. Solo me quedan 240 caracteres ... Lo pondré en una respuesta a continuación. Gracias! – Tom

+0

También me gustaría señalar que los participantes pueden ser miembros de muchas ligas. Por lo tanto, debemos intentar introducir algún código para elegir solo a los participantes que forman parte de esta liga. - Puedo construir ese guión si pudieras ayudarme. ¡Gracias de nuevo! – Tom

Cuestiones relacionadas