我在获取记录和唯一性的顺序方面遇到了问题。我有以下表格设置:
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
分组也无助于获得正确的订单。
内部联接也不起作用,因为它们不会显示不在组中的人。是否有可能在没有代码的情况下获得我想要的东西,而且只有通过查询而没有子选择?
答案 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
个与之关联的人。你想用哪一个人来排序?你可以选择其中一个,即最小的或最大的一个,但这会产生什么意义呢?此外,当列表中不可见组时,看到按组分类的人员列表是不是很令人不安?对于不知道列表是如何排序的人来说,很难确定应用了哪种排序逻辑。