该查询运行良好,并给出如下输出:

[(1, 9), (2, 12), (4, 14), (6, 14)]
    query = """
    SELECT users.id,
       count(tasks.userId)
    FROM users
    LEFT JOIN tasks ON users.id = tasks.userId
    WHERE tasks.completed = FALSE
    GROUP BY users.id
    """

但是,当我添加另一个左连接时,它不会给出准确的结果:

    query = """
    SELECT users.id,
       count(tasks.userId), count(songs.userId)
    FROM users
    LEFT JOIN tasks ON users.id = tasks.userId
    LEFT JOIN songs ON users.id = songs.userId
    WHERE tasks.completed = FALSE
    GROUP BY users.id
    """

结果应该是这样的:

[(1, 9, 10), (2, 12, 10), (4, 14, 10), (6, 14, 10)]

但是,我的结果是这样的:

[(1, 90, 90), (2, 120, 120), (4, 140, 140), (6, 140, 140)]

看起来像是tasks x 10的值,count(任务)和count(歌曲)

count(tasks.userId)个用户的 idea 是找到用户ID匹配的任务数.

推荐答案

分别在taskssongs中聚合,然后将users加入聚合结果:

SELECT u.id, 
       COALESCE(t.count_tasks, 0) count_tasks,
       COALESCE(s.count_songs, 0) count_songs
FROM users u
LEFT JOIN (
  SELECT userId, COUNT(*) count_tasks
  FROM tasks 
  WHERE completed = FALSE
  GROUP BY userId
) t ON u.id = t.userId
LEFT JOIN (
  SELECT userId, COUNT(*) count_songs
  FROM songs  
  GROUP BY userId
) s ON u.id = s.userId;

我不确定您是否真的想要LEFT个联接(至少对于表tasks),因为在您的代码中,您所说的第一个查询返回您期望的结果,尽管它包含LEFT个联接,但实际上该联接是INNER个联接,因为条件WHERE tasks.completed = FALSE只返回匹配的行.

Python相关问答推荐

将numpy矩阵映射到字符串矩阵

pyautogui.locateOnScreen在Linux上的工作方式有所不同

Python panda拆分列保持连续多行

列表上值总和最多为K(以O(log n))的最大元素数

numba jitClass,记录类型为字符串

使用miniconda创建环境的问题

输出中带有南的亚麻神经网络

根据二元组列表在pandas中创建新列

使用@ guardlasses. guardlass和注释的Python继承

try 将一行连接到Tensorflow中的矩阵

Python—从np.array中 Select 复杂的列子集

使用NeuralProphet绘制置信区间时出错

启动带有参数的Python NTFS会导致文件路径混乱

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

关于两个表达式的区别

30个非DATETIME天内的累计金额

无法在Spyder上的Pandas中将本地CSV转换为数据帧

为罕见情况下的回退None值键入

Python:从目录内的文件导入目录

将数字数组添加到Pandas DataFrame的单元格依赖于初始化