【问题标题】:Problems counting joined rows with conditional计算有条件的连接行的问题
【发布时间】:2009-09-10 15:17:21
【问题描述】:

我在使用 MySQL 和从连接表中选择列数时遇到了一些问题。我有一种感觉,这将需要一个子选择语句来获取我想要加入的行,而不是在我的主要条件中执行它。

我正在尝试选择链接到某个用户的项目列表。我还想包括分配给该项目和该用户的任务计数(但仅限于特定状态的任务)。

我几乎可以使用它 - 这意味着根本没有。它只会返回项目 id 1,而不是 id 2。这是因为我的 'tasks.status

任何帮助都会很棒。如果我需要解释其他任何内容,请告诉我。

+-------------------------+
| projects_to_users       |
+-----------+-------------+
+ user_id   | project_id  |
+-----------+-------------+
+ 1         | 1           |
+-----------+-------------+
+ 1         | 2           |
+-----------+-------------+


+-------------------------+
| projects                |
+--------------+----------+
+ project_id   | name     |
+--------------+----------+
+ 1            | Foo      |
+--------------+----------+
+ 2            | Bar      |
+--------------+----------+

+------------------------------------------------+
| tasks                                          |
+-----------+--------------+----------+----------+
+ task_id   | project_id   | status   | name     |
+-----------+--------------+----------+----------+
+ 1         | 1            | 1        | Do it    |
+-----------+--------------+----------+----------+
+ 2         | 1            | 1        | Do itt   |
+-----------+--------------+----------+----------+
+ 3         | 1            | 9        | Do not   |
+-----------+--------------+----------+----------+



SELECT count( tasks.task_id ) AS task_count, projects.*
FROM (projects)
LEFT JOIN tasks ON tasks.project_id = projects.project_id
LEFT JOIN projects_to_users ON projects.project_id=projects_to_users.project_id
WHERE tasks.status<9
AND tasks.assigned_user_id = '1'
AND projects_to_users.user_id = '1'
GROUP BY projects.project_id


RETURNS:

+--------------+--------------+--------+
+ task_count   | project_id   | name   |
+--------------+--------------+--------+
+ 2            | 1            | Foo    |
+--------------+--------------+--------+

SHOULD RETURN:

+--------------+--------------+--------+
+ task_count   | project_id   | name   |
+--------------+--------------+--------+
+ 2            | 1            | Foo    |
+--------------+--------------+--------+
+ 0            | 2            | Bar    |
+--------------+--------------+--------+

【问题讨论】:

    标签: sql mysql join


    【解决方案1】:

    如果您想显示每个项目、每个用户的任务计数,您还应该按 projects_to_users.user_id 字段分组。

    此外,您没有看到零计数项目的原因是因为您的 WHERE 条件期望通过 LEFT JOIN 子句进行匹配。如果您将 WHERE 条件移动到连接本身,这应该更适合您。

    例如:

    SELECT count( tasks.task_id ) AS task_count, 
           projects.*
    FROM (projects)
    LEFT JOIN tasks ON tasks.project_id = projects.project_id AND tasks.status < 9 AND tasks.assigned_user_id = '1'
    LEFT JOIN projects_to_users ON projects.project_id=projects_to_users.project_id AND projects_to_users.user_id = '1'
    GROUP BY projects.project_id
    

    【讨论】:

      【解决方案2】:

      为什么不能像这样简单地加入:

      select count(*) from projects_to_users inner join tasks on projects_to_users.project_id=tasks.project_id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 2022-09-25
        • 2016-01-30
        • 2021-07-21
        • 2014-02-16
        • 2020-08-20
        • 2021-01-29
        相关资源
        最近更新 更多