查询根据条件和顺序列出用户的其他条件的计数

时间:2014-05-15 14:37:34

标签: mysql sql count relationship

好吧,也许标题有点不清楚,但我正在尝试根据他们的地理区域为他们收取的工作量(即数字)订购一组人他们正在努力满足某些条件的项目。)

对于这项任务,我正在使用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中,不需要计算。

我觉得我错过了一些显而易见的东西,但是我已经尝试了一段时间而无法绕过它。

1 个答案:

答案 0 :(得分:2)

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

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;