如果他们有足够的行来满足所有条件,我将如何编写一个可以选择人名(行中的列)的查询?
例如,我有一个像这样设置的数据库:
name permission_id
Bob 1
Bob 2
Jerry 3
Jerry 1
Jose 2
Billy 1
Billy 2
我如何只选择拥有权限ID 1和2的人?换句话说,我想要一个查询,按名称检查每个人,看看他们是否拥有所有请求的权限。
在这个例子中,如果我要检查拥有权限1和2的所有用户,我应该将Bob和Billy作为返回值。
这是我当前的查询:
$this->db->select('center_user_permissions.id, center_users.first_name, center_users.last_name');
$this->db->from('center_user_permissions');
$this->db->where_in('permission_id', $permission_ids);
$this->db->join('center_users', 'center_users.center_id = center_user_permissions.center_id');
目前,此查询会返回任何拥有权限ID 1或2的人。我需要它为1和2.但我知道我不能简单地做两个因为一个特定的行不能同时拥有权限ID,但查询必须检查指定ID的所有行。
我相信我的内部需要一个SELECT语句?任何人都可以告诉我,我是否正确思考?感谢。
答案 0 :(得分:2)
您可以使用in子句来检查用户是否同时具有权限
select name
from center_user_permissions
where permissions_id in (1,2)
group by name
having count(*) = 2
答案 1 :(得分:0)
select distinct(name),.. as name from 'center_user_permissions',center_users where
center_users.center_id = center_user_permissions.center_id and permissions_id in (1,2)
替换..与您的其他字段,并将您想要独特的值放在不同的
答案 2 :(得分:0)
GROUP BY
and HAVING
不是用户在$ this-> db中使用的是什么类型的数据库接口,但它可能会让事情变得有点棘手。如果我从原始SQL查询开始:
SELECT
center_user_permissions.id,
center_users.first_name,
center_users.last_name
FROM center_user_permissions
LEFT JOIN center_users
ON center_users.center_id = center_user_permissions.center_id
WHERE center_user_permissions.permission_id in (1,2)
name
分组,其中permission_id
的数量为> 1 这会按first_name
对行进行分组(因此每个唯一名称只能获得一行)。通过执行操作,您可以针对“分组”到单行的行运行聚合函数(SUM()
,MAX()
,COUNT()
)。
SELECT
center_user_permissions.id,
center_users.first_name,
center_users.last_name
FROM center_user_permissions
LEFT JOIN center_users
ON center_users.center_id = center_user_permissions.center_id
GROUP BY center_users.first_name
WHERE center_user_permissions.permission_id in (1,2)
HAVING COUNT(center_user_permissions.permission_id)>1
答案 3 :(得分:0)
我不确定如何在CodeIgniter中构建此查询,但您可以INNER JOIN
为您希望用户拥有的每个权限ID:
SELECT center_users.center_id, center_users.first_name, center_users.last_name
FROM center_users
INNER JOIN center_user_permissions AS p1 ON p1.center_id=center_users.center_id AND p1.permission_id=1
INNER JOIN center_user_permissions AS p2 ON p2.center_id=center_users.center_id AND p2.permission_id=2
您可以为每个您想要的其他权限添加INNER JOIN
来检查更多权限。