Написание этого SQL в Kohana query builder

#sql #kohana

#sql #kohana

Вопрос:

 SELECT users.*
FROM users INNER JOIN roles_users ON users.id = roles_users.user_id 
WHERE roles_users.role_id IN (1, 2)
GROUP BY users.id
HAVING COUNT(*) = 2
  

Я зашел так далеко:

 DB::select()->from('users')->join('roles_users')
->on('users.id', '=', 'roles_users.user_id')
->where('roles_users.role_id', 'IN', array(1, 2))
  

Как я могу выполнить ГРУППИРОВКУ ПО и КОЛИЧЕСТВО (*) в Kohana query builder?

Ответ №1:

Почему бы вам не сделать это так?

 $query = DB::query(Database::SELECT, 
'SELECT users.*
FROM users INNER JOIN roles_users ON users.id = roles_users.user_id 
WHERE roles_users.role_id IN (1, 2)
GROUP BY users.id
HAVING COUNT(*) = 2'
);

$query->execute();
  

Пример:

     $results = DB::query(Database::SELECT, 
    'SELECT * FROM
    post_scheduled
    WHERE
    DATE(FROM_UNIXTIME(scheduled)) = DATE(NOW())
    AND
    TIME_FORMAT(FROM_UNIXTIME(scheduled), "%H:%i") = TIME_FORMAT(NOW(), "%H:%i")
    AND
    published = 0'
    )->execute()->as_array();

    foreach($results as $result)
    {
        $id = $result['id'];       
        # ...
    }
  

Конструктор запросов… (не тестировался)

 DB::select()
->from('users')
->join('roles_users')
->on('users.id', '=', 'roles_users.user_id')
->where('roles_users.role_id', 'IN', array(1, 2))
->group_by('users.id')
->having('COUNT(*)', '=', '2');
  

Комментарии:

1. Я получаю сообщение об ошибке в столбце COUNT, который не найден для Having() для метода query builder. Первый метод тоже в порядке, но я не знаю, как обрабатывать результаты? Я не могу сделать ->as_array() после выполнения () ? Итак, как я должен обрабатывать результаты.. для этого?

2. @Karem, я не тестировал второй, но должно быть что-то вроде этого. Я опубликовал рабочий пример, который у меня есть для первого метода.

3. Попробуйте -> имея (DB::expr(‘COUNT(*)’), ‘=’, ‘2’);