基于外键关联用户与用户图片表构建无重复SQL查询(Node.js API)
解决方案
1. SQL查询语句
用LEFT JOIN关联两张表,确保所有用户都能被查询到(包括无图片的用户):
SELECT u.ID AS user_id, u.name, u.age, ui.imageurl_id, ui.image FROM `user` u LEFT JOIN `user images` ui ON u.ID = ui.imageurl_id;
2. Node.js端数据处理
直接执行SQL会返回重复的用户记录(一个用户有多张图片就会有多条记录),需要在代码里合并相同用户的图片,生成目标格式:
以mysql2库为例,示例代码如下:
const mysql = require('mysql2/promise'); async function getUserWithImages() { // 建立数据库连接 const connection = await mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名' }); // 执行查询 const [rows] = await connection.execute(` SELECT u.ID AS user_id, u.name, u.age, ui.imageurl_id, ui.image FROM \`user\` u LEFT JOIN \`user images\` ui ON u.ID = ui.imageurl_id; `); // 用Map去重并合并图片 const userMap = new Map(); rows.forEach(row => { const userId = row.user_id; if (!userMap.has(userId)) { // 初始化用户信息,图片数组为空 userMap.set(userId, { info: { id: userId, name: row.name, age: row.age }, image: [] }); } // 如果当前记录有图片信息,添加到数组 if (row.imageurl_id) { userMap.get(userId).image.push({ imageurl_id: row.imageurl_id, image: row.image }); } }); // 转换为最终数组格式 const finalData = Array.from(userMap.values()); await connection.end(); return finalData; } // 调用并打印结果 getUserWithImages().then(data => { console.log(JSON.stringify(data, null, 2)); }).catch(err => { console.error('查询失败:', err); });
最终返回格式
执行后会输出符合要求的结构,无图片用户的image字段为空白数组:
[ { "info": { "id": 1, "name": "name 1", "age": 24 }, "image": [ { "imageurl_id": 1, "image": "pic 1.jpg" } ] }, { "info": { "id": 2, "name": "name 2", "age": 20 }, "image": [ { "imageurl_id": 2, "image": "pic 2.jpg" }, { "imageurl_id": 2, "image": "pic 3.jpg" } ] }, { "info": { "id": 4, "name": "name 3", "age": 18 }, "image": [ { "imageurl_id": 4, "image": "pic 4.jpg" }, { "imageurl_id": 4, "image": "pic 5.jpg" }, { "imageurl_id": 4, "image": "pic 6.jpg" } ] }, { "info": { "id": 5, "name": "name 4", "age": 30 }, "image": [] } ]
内容的提问来源于stack exchange,提问作者husam
相关产品推荐
相关产品推荐

