4

生態調査のデータを保管しています。各採集地で複数の個体を採集し、種名、属名、科名を特定します。

データベース内のテーブルは次のとおりです。

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!

何か案は?あなたの提案は大歓迎です!

4

1 に答える 1