如何获得3个表的外连接的唯一记录和排序?

时间:2012-02-12 21:00:39

标签: sql join group-by sql-order-by unique

我在获取记录和唯一性的顺序方面遇到了问题。我有以下表格设置:

person
groups
group_has_person

这里的想法是将人分组。 (想想你的圈子)

首先,我只有一个人员表,其中有两个ID字段链接到组记录,但后来我总是只限于一个人只有两组。现在我添加了一个链接表,以便可以将该人放入无限数量的组中。每个组都有一个排序索引字段(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分组也无助于获得正确的订单。

内部联接也不起作用,因为它们不会显示不在组中的人。是否有可能在没有代码的情况下获得我想要的东西,而且只有通过查询而没有子选择?

2 个答案:

答案 0 :(得分:1)

你几乎就在那里,但你需要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进行排序的order_index,否则你无法避免重复。

答案 1 :(得分:0)

如果某人在多个群组中,则会有不同的group.order_index个与之关联的人。你想用哪一个人来排序?你可以选择其中一个,即最小的或最大的一个,但这会产生什么意义呢?此外,当列表中不可见组时,看到按组分类的人员列表是不是很令人不安?对于不知道列表是如何排序的人来说,很难确定应用了哪种排序逻辑。