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

基于外键关联用户与用户图片表构建无重复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:35:14