You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL关联两表合并多行技能查询及结果存储到ArrayList的方法

问题解答

一、MySQL关联查询实现目标输出

你可以使用GROUP_CONCAT函数实现技能字段的逗号拼接,配合两表关联分组查询即可,SQL语句如下:

-- 如果拼接的技能内容较长,可先执行该语句调整GROUP_CONCAT最大长度,单位为字节
SET SESSION group_concat_max_len = 102400;

SELECT 
  t1.stdname, 
  GROUP_CONCAT(t2.skill SEPARATOR ',') AS skill_list
FROM table1 t1
INNER JOIN table2 t2 ON t1.stdname = t2.stdname
GROUP BY t1.stdid, t1.stdname;

注:你给出的期望输出中raghav的技能包含python属于笔误,按你提供的样例数据,该SQL实际返回的raghav技能为java,c,c++,和表2存储的内容一致。

二、将查询结果存入ArrayList

以下为Java语言实现示例(默认使用JDBC连接数据库):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class StudentSkillQuery {
    public static void main(String[] args) {
        // 定义存储最终结果的ArrayList
        ArrayList<String> resultList = new ArrayList<>();
        // 数据库连接参数请替换为你自己的配置
        String url = "jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=utf8";
        String dbUser = "你的数据库账号";
        String dbPwd = "你的数据库密码";

        try (
                // 自动释放资源的JDBC连接
                Connection conn = DriverManager.getConnection(url, dbUser, dbPwd);
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT t1.stdname, GROUP_CONCAT(t2.skill SEPARATOR ',') AS skill_list FROM table1 t1 INNER JOIN table2 t2 ON t1.stdname = t2.stdname GROUP BY t1.stdid, t1.stdname")
        ) {
            while (rs.next()) {
                String stdName = rs.getString("stdname");
                String skillStr = rs.getString("skill_list");
                // 拼接为你要求的格式存入ArrayList
                resultList.add(stdName + " " + skillStr + ".");
            }

            // 输出验证结果
            for (String item : resultList) {
                System.out.println(item);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、ArrayList存储数组变量的说明

ArrayList支持存入数组变量,因为ArrayList的元素本质是Object类型,数组本身属于对象,所以可以直接存入,实现方式如下:

// 定义存储String数组的ArrayList,泛型指定为对应数组类型即可
ArrayList<String[]> arrayWithArr = new ArrayList<>();

// 遍历结果集时改为存入数组
while (rs.next()) {
    String stdName = rs.getString("stdname");
    String skillStr = rs.getString("skill_list");
    // 拆分技能为数组
    String[] skillArr = skillStr.split(",");
    // 构造学生信息数组:第一个元素为姓名,后续为技能
    String[] studentInfo = new String[skillArr.length + 1];
    studentInfo[0] = stdName;
    System.arraycopy(skillArr, 0, studentInfo, 1, skillArr.length);
    // 将数组存入ArrayList
    arrayWithArr.add(studentInfo);
}

// 取出使用示例
for (String[] info : arrayWithArr) {
    System.out.print(info[0] + " ");
    for (int i = 1; i < info.length; i++) {
        if (i > 1) System.out.print(",");
        System.out.print(info[i]);
    }
    System.out.println(".");
}

如果需要存储其他类型的数组,只要对应调整ArrayList的泛型即可,比如存储int数组定义为ArrayList<int[]> intArrList = new ArrayList<>();。

内容的提问来源于stack exchange,提问作者GANESH AADHINENI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 04:42:01