【问题标题】:Query to list users based on condition AND order by count of other condition查询根据条件列出用户并按其他条件计数排序
【发布时间】:2014-05-15 14:37:34
【问题描述】:

好吧,也许标题有点不清楚,但我正在尝试根据他们的地理区域他们负责的工作量(即人数符合某些条件的项目)。

对于这个任务,我使用了 5 个表(我将只写相关的列):

users
-------------------------------
ID(PK) | first_name | last_name

users_data
----------------------------------
ID(PK) | user_id(FK) | area_id(FK)

projects
---------------------
ID(PK) | agent_id(FK)

states (working phases)
-------------
ID(PK) | name

projects_states (relation table)
------------------------------------------------------------
ID(PK) | project_id(FK) | state_id(FK) | created_ad (TSTAMP)

一句话:我需要居住在特定区域 (area_id) 的所有代理 (agent_id),并且我需要此列表按项目数量 (ASC) 排序,但我需要仅考虑(计数)那些属于一组状态的项目(例如,“开放”、“进行中”等)。

示例输出:

[firstName] [lastName] [projectNo]
  Agent      Six        (0)
  Agent      One        (0)
  Agent      Three      (1)
  Agent      Two        (3)
  Agent      Four       (4)

我试过这个查询:

SELECT COUNT(p.id) AS projectNo, u.*,
   (SELECT ps.state_id FROM project_states ps WHERE ps.project_id = p.id
    ORDER BY ps.created_at DESC LIMIT 1) AS last_state
FROM users u
JOIN users_data ud ON ud.user_id = u.id
JOIN projects p ON p.agent_id = u.id
WHERE ud.area_id = 1
GROUP BY u.id
HAVING last_state IN (4,5,6,7)
ORDER BY projectNo DESC

查询有效,但当然只获取(非常有限的)在该状态范围内拥有项目的用户。如果我删除 HAVING 部分,我会得到所有用户(这就是我想要的)但会产生错误的计数,因为它不应该计算分配给该用户但不在状态范围内的项目,即如果项目state_id 为 8,不需要统计。

我觉得我遗漏了一些明显的东西,但我已经尝试了一段时间并且无法理解它。

【问题讨论】:

    标签: mysql sql count relationship


    【解决方案1】:

    我建议您使用子查询来执行此操作。我想这就是你想要的:

    SELECT sum(last_state IN (4,5,6,7)) as NumProjects, u.*
    FROM (SELECT u.*,
                 (SELECT ps.state_id
                  FROM project_states ps
                  WHERE ps.project_id = p.id
                  ORDER BY ps.created_at DESC
                  LIMIT 1
                 ) AS last_state
          FROM users u JOIN
               users_data ud
               ON ud.user_id = u.id LEFT JOIN
               projects p
               ON p.agent_id = u.id
          WHERE ud.area_id = 1
         ) u
    GROUP BY u.id
    ORDER BY NumProjects DESC;
    

    【讨论】:

    • 谢谢!如果我将您的查询更改为LEFT JOIN projects p ON p.agent_id = u.id,它似乎给了我预期的结果(并非所有用户都有关联的项目,至少在这个开发阶段,我相信左连接会考虑到这一点)
    • @DamienPirsy 。 . .是的,左连接解决了这个问题。
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多