2009-09-30 3 views
0

고등학교 스포츠 기록이 학교 출석에 미치는 영향을 분석하고 있다고합니다.mysql subselect 대안

그래서 각 행은 고등학교 농구 경기에 해당하는 표가 있습니다. 각 게임은 원정 팀 ID와 홈 팀 ID (FK에서 다른 "팀 테이블"까지)와 홈 스코어와 어웨이 스코어와 데이트를 가지고 있습니다. 나는이 시즌 농구 경기에 출석을 맞추는 질의를 쓰고있다.

내 샘플 출력은 지금 각 팀 내 분석 이전 시즌을 어떻게했는지 추가 할 (#_students_missed_class, day_of_game, home_team, away_team, home_team_wins_this_season, away_team_wins_this_season)

될 것입니다. 글쎄, 나는 그들의 이전 시즌이 게임 테이블에 저장되어 있지만 나는 subselect와 함께 그것을 성취 할 수 있어야한다. 그래서 지금은 전년 대비 계산 된 모든 승리를 가지고있는 HOME_TEAM의 ID를 참조 team-table.id이 경우

SELECT COUNT(*) FROM game_table 
WHERE game_table.date 
BETWEEN 'start of previous season' AND 'end of previous season' 
AND (
    (game_table.home_team = team_table.id 
    AND game_table.home_score > game_table.away_score) 
    OR (game_table.away_team = team_table.id 
    AND game_table.away_score > game_table.home_score)) 

:

그래서 내 주요 select 문에 나는 부속을 추가합니다.

이 계산 방법은 시간도 자원 집약도 아닙니다. Explain SQL은 Type 필드에 ALL이 있고 키를 사용하지 않고 쿼리 시간이 초과되었음을 보여줍니다. 내가 어떻게 subselect와 함께보다 효율적인 쿼리를 수행 할 수 있는지 잘 모르겠습니다. 이 쿼리 중 4 개 (가정용, 자택 용, 멀리 떨어져있는 것, 떨어져있는 것)를 작성하는 것이 바람직하지 않은 것 같습니다.

나는 이것이 더 명쾌 할 수 있다고 확신한다. 누구나 궁금한 점이 있으시면 내일 색을 추가하겠습니다.

+0

감사합니다. 나는 적절한 예의가 있다는 것을 결코 알지 못했습니다. 나는 돌아가서 그것을했거나 앞으로도 할 것이다. –

답변

0

제 의견으로는 "내 rdbms가 나를 위해 모든 것을 할 수있게하는 것"의 또 다른 경우입니다. 일부 시나리오/쿼리에 대해서는 데이터베이스를 최적화 할 수 없다는 점을 받아 들여야합니다. 추가 한 인덱스의 수와 상관없이 하위 쿼리와 같은 상위 쿼리는 속도가 느려집니다.

위의 예는 이것에 대한 명확한 사례입니다. 하위 쿼리 (이전 시즌 팀의 실적)에 표시되는 데이터는 정적 데이터입니다. 이전 데이터이므로 변경할 수 없거나 변경되지 않습니다 . 이 데이터를 별도로 쿼리하고 응용 프로그램에서 메모리에 보유한 다음 루프를 반복하면서 기본 쿼리의 결과에 수동으로 추가해야합니다.

+0

고마워. athis 예를 들어 SQL에서 결과를 생성해야한다고 말합니다. 어떤 제안? –

0

MySQL에서 가장 좋은 옵션은 필요한만큼 여러 번에 참여할 수있는 뷰를 갖는 것입니다.

MySQL은 다음 한 성명에서 모든 것을 할 수있는 열팽창 계수를 지원하는 경우 ...

with prior_season as (
    select ... 
) 
    select 
    ... 
    join prior_season as hone_wins on ... 
    join prior_season as home_losses on ... 
    ... etc 

이 당신을 많이하고 싶은거야 뭔가가 있다면, 그것은을위한 괜찮은 인수 수 있습니다 다른 RDBMS로 전환합니다. Postgres는 지금 그것들을 지원하며, 거의 모든 주요 상업용 벤더의 무료 버전도 지원합니다.