簡體   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