多くの投稿を見てきましたが、答えが得られませんでした構造を持つテーブルがあります
subject_level_id | tutor_id | level_id_fk | subject_id_fk |
118 | 99 | 4 | 1 |
119 | 99 | 3 | 2 |
120 | 99 | 3 | 3 |
121 |100 | 3 | 1 |
122 |100 | 4 | 2 |
特定のレベルの 1 つ、2 つ、またはそれ以上の科目を教える家庭教師のチューター ID を抽出したい (科目の数は、ユーザーが選択した科目によって異なりますが、レベルは特定のクエリに対して一意になります)
他の投稿の助けを借りてクエリを作成しましたが、チューターのレコードが 10,000 件あるため、被験者の数が 2 を超えると非常に遅くなり、悪化します。クエリは次のとおりです。
select distinct
a.tutor_id
from
tutor_preferred_level_subject as a
inner join
tutor_preferred_level_subject as b
on a.level_id_fk = b.level_id_fk
where
a.subject_id_fk = 1 and
b.subject_id_fk = 10 and
a.level_id_fk = 3
提案:同じ列で複数の WHERE 条件を使用した SELECTING
この質問と私の質問の違いは、両方の科目を正確に教えてくれる家庭教師が欲しいということです。
更新: はい、主な関心事はパフォーマンスです。このクエリは 2 つのサブジェクトに対しては正常に機能しますが、2 つ以上のサブジェクトに対しては、mysql サーバーは永遠に処理を続けます。インデックスはsubject_level_id
ほぼ 13000 のレコードがあり、以下のクエリは約 6500 の結果を返します。
Jakub Sachaが要求したように、これらは次の結果です
EXPLAIN select distinct
a.tutor_id
from
tutor_preferred_level_subject as a
inner join
tutor_preferred_level_subject as b
on a.level_id_fk = b.level_id_fk
where
a.subject_id_fk = 1 and
b.subject_id_fk = 10 and
a.level_id_fk = 3
id select_type table type possible_keys key key_len ref|
1 SIMPLE a ALL NULL NULL NULL NULL
1 SIMPLE b ALL NULL NULL NULL NULL
rows Extra
12733 Using where; Using temporary
12733 Using where; Distinct