繁体   English   中英

MySQL - 从两个表中一对多选择

[英]MySQL - one to many select from two tables

我有两个表,一个包含人名(+ 其他数据),另一个包含与人相关的标签。

人们:

person_id  name     other ...
1          Name 1   ...
2          Name 2   ...
3          Name 3   ...
...

标签:

person_id  tag_id
1          2
1          3
2          6
1          7
2          8
1          1
...

我想同时从两个表中选择信息,结果类似于:

person_id=1, name=Name 1, tag_id=[2,3,7,1]

这样我就可以使用 Spring JDBC RowMapper 执行以下操作:

@Override
public PersonDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
    PersonDetails personDetails = new GameDetails();
    personDetails.setId(rs.getLong("person_id"));
    personDetails.setName(rs.getString("name"));
    personDetails.setTags((int[]) rs.getArray("tag_id").getArray());
    return personDetails;
}

请尝试以下操作:

SELECT
  t.person_id,
  p.name,
  GROUP_CONCAT(t.tag_id SEPARATOR ',') `tag_id`
FROM
  tags t
  JOIN people p ON t.person_id = p.person_id
GROUP BY
  t.person_id

这将导致

person_id   name    tag_id
1           Name1   3,7,1,2
2           Name2   6,8

另见group_concat

由于您只是返回PersonDetails我假设您的查询假设只返回一个PersonDetails而不是它的列表。 为此,您可以选择执行以下操作

SELECT * FROM people p INNER JOIN tags t ON p.person_id = t.person_id where p.person_id = "your_person_id"

@Override
public PersonDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
    PersonDetails personDetails = new GameDetails();
    personDetails.setId(rs.getLong("person_id"));
    personDetails.setName(rs.getString("name"));
    List<Integer> tagList = new ArrayList<Integer>();
    while(rs.next())
    {
        tagList.add()rs.getInt(tag_id);
        personDetails.setTags((int[]) rs.getArray("tag_id").getArray());
    }
    personDetails.setTags(tagList.toArray());
    return personDetails;
}

即使您想在 PersonDetails 创建一个 HashMap 并继续在其中存储对象时返回 List 。 对于每次迭代,检查它是否存在于地图中并相应地更新或创建。 最后返回 map.values() 应该返回一个列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM