MySQL - 一对多选择两个表

时间:2015-09-13 06:25:45

标签: java mysql

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

人:

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;
}

2 个答案:

答案 0 :(得分:1)

尝试以下方法:

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

答案 1 :(得分:1)

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

  

SELECT * FROM people p INNER JOIN标签t ON p.person_id = t.person_id其中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(),它应该返回一个List。