我用php和mysql数据库构建了一个Web应用程序。用户可以提出想法或提出请求,站点管理员可以对其进行验证。如果所有经理都验证了请求,则请求将被接受。
我的数据库中有 4 个表,一个用于用户,一个用于用户的请求,一个用于经理,一个用于经理的验证流程。
User
______
Id PK
Name
...
User_s_request
______________
Id PK
User_id
Request
Manager
_________
User_id PK
Manager_s_validation
____________________
User_request_id PK
Manager_id PK
Validation_date
当经理转到验证页面时,我会显示一个 html 表,显示仍需要此管理器验证的用户请求。
SELECT ur.id from user_request AS ur
JOIN manager_validation AS mv ON mv.user_request_id = ur.id
JOIN manager AS m ON m.user_id = mv.manager_id
WHERE mv.manager_id != $manager_id OR mv.user_request_id IS NULL
LIMIT 1
当此管理器尚未验证时,我的查询有效。将显示请求。当唯一的验证来自此管理器时,我的查询有效。但是,如果此经理和另一个(或多个(经理经过验证,则不起作用。在不应显示请求时显示请求。
怎么可能是正确的要求?
在我看来
,您正在搜索NOT EXISTS
,即选择对某个管理器不存在验证的所有用户请求。
SELECT *
FROM user_request ur
WHERE NOT EXISTS (SELECT *
FROM manager_validation mv
WHERE mv.user_request_id = ur.id
AND mv.manager_id = ?);
多
亏了@sticky位,我找到了解决方案,这里是:
SELECT *
FROM user_request ur
WHERE ur.id NOT IN
// I select the ids of the validated requests (by this manager)
(SELECT mv.user_request_id
FROM manager_validation mv
WHERE mv.manager_id = ?);
// the users_s_request may be displayed several times (for each validation by a manager)
// so I limit the result to 1 only
LIMIT 1