Mysql SELECT name,其中所有具有名称的行都具有特定值

时间:2016-06-16 20:25:05

标签: php mysql codeigniter

如果他们有足够的行来满足所有条件,我将如何编写一个可以选择人名(行中的列)的查询?

例如,我有一个像这样设置的数据库:

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语句?任何人都可以告诉我,我是否正确思考?感谢。

4 个答案:

答案 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)

MySQL的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来检查更多权限。