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

如何通过Supabase关联查询获取用户及未完成任务数量?

获取用户列表及未完成任务数的实现方案

完全可行,以下是具体实现方式:

核心SQL查询

使用LEFT JOIN关联用户表和任务表,确保所有用户都被包含(即使没有任务),再通过条件聚合函数统计未完成任务的数量:

写法一(COUNT + CASE)

SELECT 
    u.id,
    u.name,
    COUNT(CASE WHEN t.status != 'completed' THEN 1 END) AS unfinishedTasks
FROM users u
LEFT JOIN tasks t ON u.id = t.user_id
GROUP BY u.id, u.name;

写法二(SUM + CASE)

如果偏好更直观的统计逻辑,也可以使用SUM:

SELECT 
    u.id,
    u.name,
    SUM(CASE WHEN t.status != 'completed' THEN 1 ELSE 0 END) AS unfinishedTasks
FROM users u
LEFT JOIN tasks t ON u.id = t.user_id
GROUP BY u.id, u.name;

注意:请将'completed'替换为你实际业务中代表任务完成的status值(比如数字1、字符串'done'等)。

应用层示例(Node.js)

如果需要在代码中获取并输出你预期的格式,以Node.js + mysql2为例:

const mysql = require('mysql2/promise');

async function fetchUsersWithUnfinishedTasks() {
  // 建立数据库连接
  const conn = await mysql.createConnection({
    host: '你的数据库地址',
    user: '数据库用户名',
    password: '数据库密码',
    database: '目标数据库名'
  });

  // 执行SQL查询
  const [result] = await conn.execute(`
    SELECT 
      u.id,
      u.name,
      COUNT(CASE WHEN t.status != 'completed' THEN 1 END) AS unfinishedTasks
    FROM users u
    LEFT JOIN tasks t ON u.id = t.user_id
    GROUP BY u.id, u.name;
  `);

  await conn.end();
  return result;
}

// 调用并打印结果
fetchUsersWithUnfinishedTasks().then(users => {
  console.log(JSON.stringify(users, null, 2));
  // 输出将与你预期的格式一致
});

关键说明

  • LEFT JOIN:确保即使用户没有任何任务,也会被包含在结果集中,此时unfinishedTasks为0。
  • 条件聚合:通过CASE判断任务是否未完成,再用COUNT或SUM统计数量,避免将已完成任务或NULL值计入统计。

内容的提问来源于stack exchange,提问作者Łukasz Florczak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:40:36