2016-12-21 2 views
0

結果セットを生成するために複数のクエリを置き換えるクエリを実行しようとしています。かなり単純な1対1の結合がありますが、プライマリレコードごとに複数のレコードを保持するテーブルから取得しようとしている1つの列があります。自動インクリメントidカラムとmeet_entryサブクエリのクエリが大幅に遅くなる

のidカラムへの外部キーを持つ複数の行がある場合があり、主キーのid列と他の列の束と

meet_entries、 meet_entries_statuses、:基本的にはこのようなものですmeet_entries内の各行のためのmeet_entry_statusesに格納します。私のクエリでは、meet_entry主キーidに関連付けられた、最近追加された(最高のID番号)行を取得しようとしています。

SELECT 
    meet_entries.id, 
    member.firstname, 
    member.surname, 
    member.gender, 
    member.dob, 
    clubs.code, 
    clubs.clubname, 
    meet_entries.meals, 
    meet_entries.massages, 
    meet_entries.cost, 
    meet_entries.cancelled, 
    (SELECT meet_entry_status_codes.description 
    FROM meet_entry_statuses, meet_entry_status_codes 
    WHERE meet_entry_statuses.code = meet_entry_status_codes.id 
    AND meet_entry_statuses.id = meet_entries.id 
    ORDER BY meet_entry_statuses.id DESC 
    LIMIT 1) as status, 
    COUNT(DISTINCT meet_events_entries.id) as entries 
FROM meet_entries, meet_events_entries, member, clubs, meet_entry_statuses, meet_entry_status_codes 
WHERE meet_entries.meet_id = ? 
    AND meet_entries.id = meet_events_entries.meet_entry_id 
AND meet_entries.member_id = member.id 
AND meet_entries.club_id = clubs.id 
GROUP BY meet_entries.id 
; 

ビットを追加:

(SELECT meet_entry_status_codes.description 
FROM meet_entry_statuses, meet_entry_status_codes 
WHERE meet_entry_statuses.code = meet_entry_status_codes.id 
AND meet_entry_statuses.id = meet_entries.id 
ORDER BY meet_entry_statuses.id DESC 
LIMIT 1) as status, 

は決して終えないために、第二の0.2であることから、クエリを取る

は、ここに私のクエリです。 meet_entriesには一致する行が10行しかありません。 meet_entries_statusesには、meet_entriesの10行に適切な行が約50行ありますが、私はそれぞれのmeet_entries行に対して1行だけを取得しようとしています。これを行うためのより良い方法に関する提案はありますか?

答えて

1

meet_entry_statusesmeet_entry_status_codesに参加する理由がわかりません。そうすることは、クロスジョインをしていることを意味します。だからmeet_entriesにN行、上記の2つのテーブルにそれぞれM行とP行があると、N x M x P行が生成されます。

2つの結合を取り出せますか?私は次のような書き直しクエリでそれらをマークしました:

SELECT 
    meet_entries.id, 
    member.firstname, 
    member.surname, 
    member.gender, 
    member.dob, 
    clubs.code, 
    clubs.clubname, 
    meet_entries.meals, 
    meet_entries.massages, 
    meet_entries.cost, 
    meet_entries.cancelled, 
    (SELECT 
      meet_entry_status_codes.description 
     FROM 
      meet_entry_statuses   as mes 
      , meet_entry_status_codes as mesc 
     WHERE 
      meet_entry_statuses.code = meet_entry_status_codes.id 
      AND meet_entry_statuses.id = meet_entries.id 
     ORDER BY meet_entry_statuses.id DESC 
     LIMIT 1 
    ) as status, 
    COUNT(DISTINCT meet_events_entries.id) as entries 
FROM 
    meet_entries     as me 
    , meet_events_entries   as mee 
    , member      as m 
    , clubs       as c 
    , meet_entry_statuses   as mes  -- try taking this out 
    , meet_entry_status_codes  as mesc  -- try taking this out 
WHERE 
    meet_entries.meet_id = ? 
    AND meet_entries.id = meet_events_entries.meet_entry_id 
    AND meet_entries.member_id = member.id 
    AND meet_entries.club_id = clubs.id 
GROUP BY meet_entries.id 
; 
+1

これは間違いなく違いがあります。私は、JOINなしでFROM句にそれらを含めることがそれを実現したことに気づいていませんでした。 –

関連する問題