【发布时间】:2012-02-12 21:00:39
【问题描述】:
我在获取一些记录排序和唯一性时遇到了问题。我有以下表格设置:
person
groups
group_has_person
这里的想法是将人分组。 (想想 Google+ 圈子)
首先,我只有一个人表,其中有 2 个 ID 字段链接到组记录,但后来我总是被限制为只能在 2 个组中拥有一个人。现在我添加了一个链接表,因此可以将该人放入无限数量的组中。每个组都有一个排序索引字段 (group.order_index)。这是一个定义组排序顺序的整数。这个想法是按组显示所有人员,并且每个人只显示一次,但不是按名称或 ID 排序,而是按组的额外索引字段排序。所以实际上我想展示所有人,即使他们不在一个组中。但是当他们在一个或多个组中时,我想按group.order_index 的顺序显示它们,并且只显示一次。
查询结果应如下所示:
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
请注意,group_id 不是排序依据的列,但该表有一个额外的字段,因此可以在创建组后更改顺序。
我收到了一些接近预期结果的查询,但我还没有:
以下查询给出了预期的排序结果,但是当一个人在多个组中时,它仍然给出了多次:
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 分组也无助于获得正确的顺序。
内部联接也不起作用,因为它们不会显示不在组中的人。是否有可能在没有代码的情况下仅通过查询而无需子选择来获得我想要的东西?
【问题讨论】:
标签: sql join group-by sql-order-by unique