[英]One statement to select data from two MySQL tables. Show name instead of/by ID
[英]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
由于您只是返回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.