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
相关产品推荐
相关产品推荐

