2

我在人与人之间建立了一对多的关系,并记录了他们。每人可以有 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 个注释的连接。

4

2 回答 2

0

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

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功能将所有音符组合成一列。

于 2012-10-25T20:53:33.710 回答
0

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

为每组选择行数,其中两个列值组成一组

并且,请参阅我的回答。

为每组选择行数,其中两个列值组成一组

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

于 2012-10-25T20:39:36.623 回答