2015-11-12 2 views
2

У меня есть модель базы данных, которая хранит пользователя в группах, а для каждой группы - другие права. Структура показана на изображении.Как выбрать пользователя с большим количеством условий

How tables looks

Я хочу сделать SELECT запрос, возвращать пользователя (ей), которые имеют один или больше прав.

Im используя medoo

public function selUserByRight($rightID) 
    { 

     return $this->db->select(
      "Users", 
      [ 
       "[>]GroupRight" => ["FK_Group" => "FK_Group"], 
       "[>]Rights" => ["GroupRight.FK_Right" => "ID"] 
      ], 
      [ 
       "Users.ID","Users.Name","Rights.ID(RightID)","Rights.Right" 
      ], 
      [ 
       "AND" => 
        [ 
         "Rights.ID" => $rightID 
        ] 
      ] 
     ); 
    } 

Использование:

$result = $db->selUserByRight(1,2,3); 

Сырье запроса:

SELECT "Users"."ID","Users"."Name","Rights"."ID" 
AS "RightID","Rights"."Right" 
FROM "Users" 
LEFT JOIN "GroupRight" ON "Users"."FK_Group" = "GroupRight"."FK_Group" 
LEFT JOIN "Right" ON "GroupRight"."FK_Right" = "Rights"."ID" 
WHERE "Rights"."ID = 1 

Проблема заключается в том, что запрос возвращает всех пользователей, но я хочу вернуть только user1 (потому что только у этого пользователя есть все права wanter).

Есть ли решение?

+0

Если вы можете предоставить нам свою структуру таблицы и некоторые выборочные данные на SQL Fiddle. –

+0

Любое повезло с этим? –

ответ

1

Я думаю, что вы можете попробовать следующее:

SELECT dd.ID, dd.Name, dd.FK_Group, _aa.total_rights 
FROM (
    SELECT aa.ID, COUNT(*) AS total_rights 
    FROM Users AS aa 
    INNER JOIN Groups AS bb 
    ON aa.FK_Group = bb.ID 
    INNER JOIN GroupRight AS cc 
    ON bb.ID = cc.FK_Group 
    GROUP BY aa.ID 
    HAVING COUNT(*) > 0 
) AS _aa 
INNER JOIN Users AS dd 
ON dd.ID = _aa.ID 
ORDER BY _aa.total_rights; 
Смежные вопросы