好吧,也许标题有点不清楚,但我正在尝试根据他们的地理区域和为他们收取的工作量(即数字)订购一组人他们正在努力满足某些条件的项目。)
对于这项任务,我正在使用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中,不需要计算。
我觉得我错过了一些显而易见的东西,但是我已经尝试了一段时间而无法绕过它。
答案 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;