【问题标题】:How do I get unique records and ordering on outer join with 3 tables?如何在具有 3 个表的外部联接中获得唯一记录和排序?
【发布时间】: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


    【解决方案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

    【讨论】:

    • 它的作用就像一种魅力,我也知道它听起来很合乎逻辑;)
    【解决方案2】:

    如果一个人在多个组中,它将有不同的group.order_indexes 与之关联。你想按哪一个来排序这个人?您可以只选择其中一个,即最小或最大的一个,但这有什么意义呢?此外,当组在列表中不可见时,查看按组排序的人员列表不会令人不安吗?对于不知道列表如何排序的人来说,很难弄清楚应用了哪种排序逻辑。

    【讨论】:

    • 这在视觉上已解决,因此您可以看到组的开始和结束位置。但也许你是对的,当他们在多个组中时,我必须向他们展示不止一次,这样用户就不会感到困惑。
    • 我可能会同时支持这两种排序选项,因为按组排序人员是组的最初目标,所以我不能忽略它
    猜你喜欢
    • 2018-12-06
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2020-07-10
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多