私はレコードと一意性のいくつかの注文に問題があります。私はテーブルの次のセットアップを持っている: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します。 – Huupke
それは魅力のように機能し、私にも論理的に聞こえる; – Huupke