MySQL: как объединить несколько запросов SELECT, используя разные критерии WHERE для одной таблицы? - PullRequest
5 голосов
/ 29 мая 2009

Я пробовал много разных способов решить эту проблему на этом форуме и на многих других. Я не могу найти решение этой проблемы или любую документацию, которая даст мне прямой ответ.

Интересно, не могли бы вы взглянуть на это для меня?

Спасибо

ПРОБЛЕМА:

У меня есть база данных со следующими таблицами participant_scores лиги раунды

В настоящее время я могу отображать результаты одного раунда, один раунд за раз ... именно так я и хочу. Но я также хочу отобразить счет, который получил каждый участник за все раунды. Допустим, у нас есть 2 раунда. Я хочу, чтобы результат на экране результатов выглядел примерно так:

 Currently viewing league 20, Round 1
 of 2:

 User Name |  Score   |  Total Score

 Tom       |   10     |    200

 James     |   50     |    300

username - имя участника оценка = оценка за текущий раунд общий счет = все круглые очки для этой лиги, сложенные вместе.

Мой MySQL запрос ниже. Извиняюсь за беспорядок, я переписал его около 100 раз, и этот текущий способ - единственный способ, который работает полностью.

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

1 Ответ

7 голосов
/ 29 мая 2009

Что вы хотите здесь, это подзапрос в этой форме:

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

Подзапрос в виде столбца будет рассчитываться для каждой строки, возвращаемой из исходного запроса.

Чтобы добавить его в свой запрос:

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

Я немного беспокоился о подзапросе, включающем несколько лиг, но похоже, что один участник может в любом случае принадлежать только одной лиге. Вам может понадобиться включить что-то в подзапрос, чтобы проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...