【问题标题】:Find first, second, third, and so forth record per person查找每人的第一、第二、第三等记录
【发布时间】:2012-10-16 01:05:14
【问题描述】:

我在人与人之间建立了一对多的关系,并记录了他们。每人可以有 0 个或多个便笺。

我需要将所有笔记放在一个字段中,因为不会有很多人有笔记,我计划每人只带入前 3 个笔记,我认为我最多可以使用 3 个查询以收集我的所有信息。

我的问题是将 mySQL 查询放在一起以获取每个人的第一个、第二个等注释。

我有一个查询,可以让我知道每个人有多少笔记,而我的表中有这些笔记。我尝试了类似的东西

SELECT
 f_note, f_person_id
FROM
 t_person_table,
 t_note_table
WHERE
 t_person_table.f_number_of_notes > 0
 AND t_person_table.f_person_id = t_note_table.f_person_id
GROUP BY
 t_person_table.f_person_id
LIMIT 1 OFFSET 0

我曾希望最多运行 3 次,将 OFFSET 更改为 1,然后更改为 2,但我得到的只是返回一个音符,而不是每人一个音符。

如果不继续阅读示例,我希望这很清楚:

我有 3 个人在桌子上。一个人 (A) 有 0 个笔记,一个 (B) 有 1 个,一个 (C) 有 2 个。

首先,我将获取人员 B 和 C 的第一个注释并将它们插入到我的人员表注释字段中。

然后我会得到人 C 的第二个注释并将其添加到人员表的注释字段中。

最后,我会为 B 和 C 提供注释,其中 C 的注释字段将是他们 2 个注释的连接。

【问题讨论】:

    标签: mysql rows


    【解决方案1】:

    欢迎来到 SO。您正在尝试做的事情,从表中为提到的每个人选择三个最近的项目,这在 MySQL 中并不容易。但这是可能的。看到这个问题。

    Select number of rows for each group where two column values makes one group

    然后,看看我的回答。

    Select number of rows for each group where two column values makes one group

    一旦您有一个提供三行的查询,您就可以使用GROUP_CONCAT() ... GROUP BY 来聚合注释字段。

    【讨论】:

      【解决方案2】:

      您可以使用这样的嵌套查询为每个人获取一个注释:

      SELECT
       f_person_id,
       (SELECT f_note
        FROM t_note_table
        WHERE t_person_table.f_person_id = t_note_table.f_person_id
        LIMIT 1) AS note
      FROM
       t_person_table
      WHERE
       t_person_table.f_number_of_notes > 0
      

      请注意,SQL 中的表基本上没有定义的固有顺序,因此您应该在子查询中使用某种形式或ORDER BY。否则,您的结果可能是随机的,并且要求不同音符的重复运行可能会意外返回相同的数据。

      如果您在任何情况下都只希望串联注释,那么您可以使用GROUP_CONCAT 函数将所有注释合并到一个列中。

      【讨论】:

      • 谢谢!一旦我看到你的回答,我记得我知道这一点。当我确实需要在“选择”部分中完成选择时,我已经在脑海中意识到我需要在“从”部分中进行选择。但我也玩弄了一些 GROUP_CONCAT 并且能够想出一个语句来满足我的需要。我感谢大家的帮助。我是一名中级 sql 用户,正在努力适应更复杂的查询,我肯定会回来的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多