如何通过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
相关产品推荐
相关产品推荐

