2012-02-12 12 views
0

私はレコードと一意性のいくつかの注文に問題があります。私はテーブルの次のセットアップを持っている:3つのテーブルを使用して一意のレコードと外部結合の順序を取得するにはどうすればよいですか?

person 
groups 
group_has_person 

ここでの考え方は、グループに人物を並べ替えることです。

最初に私は2つのIDフィールドがグループレコードにリンクされている人のテーブルしか持っていませんでしたが、私はいつも2人のグループしか持たない人に限られていました。今私は人がグループの無制限量に配置することができるようにリンクテーブルを追加しました。すべてのグループにはソートインデックスフィールド(group.order_index)があります。これは、グループの並べ替え順序を定義する整数です。アイデアは、グループごとにグループ化されたすべての人物を表示し、すべての人物を一度だけ表示するだけでなく、名前やIDではなく、グループの余分なインデックスフィールドで順序付けすることです。だから実際には、グループにいなくてもすべての人を見せたいと思っています。しかし、1つ以上のグループに所属している場合は、group.order_indexの順に表示したいだけです。

クエリの結果は次のようになります。group_idのことで注文する列ではなく、順序がグループの作成後に変更することができますので、そのテーブルには、余分なフィールドを持っていることを

person.name person.person_id group.group_id group.order_index 
Rick   1     1    1 
Tom   2     1    1 
Jan   4     3    2 
Kees   3     3    2 
Piet   5     NULL    NULL 

は注意してください。

は、私は私の期待される結果に親しまいくつかのクエリを得たが、私はそこにまだいないよ:

この次のクエリでは、結果の並べ替えが期待できますが、それは複数のグループにあるとき、それはまだ、複数回の人を与えます:

SELECT 
    person.person_id AS 'person.person_id', 
    person.name AS 'person.name', 
    group.order_index AS 'group.order_index', 
FROM 
    `person` 
LEFT OUTER JOIN `group_has_person` ON person.person_id = group_has_person.person_id 
LEFT OUTER JOIN `group` ON group_has_person.group_id = group.group_id 
ORDER BY 
    3 ASC , 
    2 ASC 

キーワード-DISTINCTも役に立たなかった。

次のクエリでは、ユニークな人物を与えるが、order by group_order_indexが動作しても、障害のある数字を示していません。

SELECT 
    person.person_id AS 'person.person_id', 
    person.name AS 'person.name', 
    group.order_index AS 'group.order_index', 
FROM 
    `person` 
LEFT OUTER JOIN `group_has_person` ON person.person_id = group_has_person.person_id 
LEFT OUTER JOIN `group` ON group_has_person.group_id = group.workgroup_id 
GROUP BY 
    group_has_person.person_id 
ORDER BY 
    3 ASC , 
    2 ASC 

はまたperson.person_idによってグループ化することは、正しい順序を取得して助けにはなりません。

グループに属していない人が表示されないため、内部結合も機能しません。私はコードなしで、そしてサブ選択を持たない質問だけで私が望むものを得ることは可能ですか?

答えて

1

あなたは、ほとんど存在していますが、order_indexに集約関数が必要です。人は、いくつかのグループに属している場合は、並べ替えるためにどのorder_index選択しない限り、あなたは重複を避けることができない、言い換えれば

SELECT 
person.person_id AS 'person.person_id', 
person.name AS 'person.name', 
MIN(group.order_index) AS 'group.order_index', 
FROM person 
LEFT OUTER JOIN group_has_person ON person.person_id = group_has_person.person_id 
LEFT OUTER JOIN group ON group_has_person.group_id = group.workgroup_id 
GROUP BY 
person.person_id, person.name 
ORDER BY 
3 ASC, 2 ASC 

をmin、max、avgまたはsumを使用します。

+0

私はそれを試してみて、それが動作するときに+1します。 – Huupke

+0

それは魅力のように機能し、私にも論理的に聞こえる; – Huupke

0

人が複数のグループに属している場合、それには異なるgroup.order_indexが関連付けられます。あなたはどちらをソートしたいのですか?最小のものから最大のものまで、そのうちの1つを選ぶことができますが、どのような意味がありますか?さらに、リストにグループが表示されていないときに、グループ別にソートされた人物リストを表示するのが邪魔になることはありませんか?どのような並べ替えロジックが適用されたかを把握するために、リストがどのようにソートされているかを知らない人にとっては、難しいでしょう。

+0

これは視覚的に解決されているので、グループの始まりと終わりを見ることができます。しかし、おそらくあなたが正しいと私は人々が複数のグループにいるときに複数回表示しなければならないので、ユーザーは混乱することはありません。 – Huupke

+0

私はおそらく両方の並べ替えのオプションをサポートします。なぜなら、グループで注文することは、グループを持つという初期の目標だったので、私はそれを省略できません。 – Huupke

関連する問題