生態調査のデータを保管しています。各採集地で複数の個体を採集し、種名、属名、科名を特定します。
データベース内のテーブルは次のとおりです。
1) tab_indiv: 見つかった各個人のデータを保存します。各個体は、種のテーブル (tab_indiv.ref_id_species、個体が属する種) の 1 つのレコードと、サイトのテーブル (tab_indiv.ref_id_site、個体がサンプリングされたサイト) の 1 つのレコードのみを好みます。
2) tab_site: 調査が行われたすべてのサイトのリスト。キー (一意の ID) は tab_site.id_site です
3) tab_species: 見つかったすべての種のリスト。キー (一意の ID) は tab_species.id_species です。tab_species.ref_id_genus による属のテーブルの 1 つのレコードのみにリンクします。
4) tab_genus: 見つかったすべての属のリスト。キー (一意の ID) は tab_genus.id_genus です。tab_genus.ref_id_family による家族のテーブルの 1 つのレコードのみへのリンク
5) tab_family: 見つかったすべてのファミリのリスト。キー (一意の ID) は tab_family.id_family です。
私がやりたいのは、各サイトで見つかった個体と、その種名、属、科をリストすることです。私はこのようなものがうまくいくことを望んでいました:
SELECT
tab_indiv.ref_id_species AS 'Species Name',
tab_species.id_species AS 'Species Name 2', -- Just to check if I got the joins ok
tab_genus.id_genus AS 'Genus Name',
tab_family.id_family AS 'Family Name'
tab_site.id_site AS 'Site Num'
FROM (tab_site
LEFT JOIN tab_indiv
ON tab_site.id_site = tab_indiv.ref_id_site
LEFT JOIN tab_species
ON tab_indiv.ref_id_species = tab_species.id_species
LEFT JOIN tab_genus
ON tab_species.ref_id_genus = tab_genus.id_genus
LEFT JOIN tab_family
ON tab_genus.ref_id_family = tab_family.id_family);
...しかし、うまくいきません。サイトごとに複数のファミリがある場合、個人のリストが重複し、すべての個人がすべてのファミリに結合されますが、各個人は 1 つのファミリにのみ属することができます。3 番目の LEFT JOIN を追加すると、問題が発生します。
理想的には、私はこのようなものを手に入れるでしょう
sp1 | gen1 | fam1 | site1
sp2 | gen1 | fam1 | site1 -- sp1 and sp2 belongs to gen1
sp3 | gen2 | fam2 | site1
sp4 | gen3 | fam2 | site1 -- gen1 and gen2 belongs to fam2
代わりに、私が得ているのは
sp1 | gen1 | fam1 | site1 -- ok!
sp2 | gen1 | fam1 | site1 -- ok!
sp1 | gen1 | fam2 | site1 -- notice that sp1 and gen1 does not belong to fam2
sp2 | gen1 | fam2 | site1 -- notice that sp2 and gen1 does not belong to fam2
sp3 | gen2 | fam1 | site1 -- notice that sp3 and gen2 does not belong to fam1
sp4 | gen3 | fam1 | site1 -- notice that sp4 and gen3 does not belong to fam2
sp3 | gen2 | fam2 | site1 -- ok!
sp4 | gen3 | fam2 | site1 -- ok!
何か案は?あなたの提案は大歓迎です!