2013-11-17 2 views
0

У меня есть три таблицы, пользователи, профили и запросы. Только пользователи, которые создали запросы, будут иметь строку в таблице запросов. Но мне все равно нужно вернуть всех пользователей и отобразить общее количество запросов для каждого пользователя. Я разработал нижеприведенный запрос, который возвращает только тех пользователей, у которых есть запись в таблице запросов, хотя мне нужны все пользователи и для нее возвращать 0 для запросов пользователей, если соответствующая строка не найдена.Как вернуть все строки, даже если они не имеют строк в объединенной таблице

public function getAllUsers() 
    { 
     $select = $this->userRepository->select(); 
     $select->setIntegrityCheck(false) 
       ->from('users', array('id', 'username', 'date_created', 'active', 'last_login', 'role')) 
       ->join('profiles', 'users.id = profiles.user_id', array('profile_id' => 'id', 'first_name', 'last_name', 'email', 'avatar', 'on_mailing_list')) 
       ->join('recommendation_requests', 'users.id = recommendation_requests.user_id', array('requests' => 'count(*)')) 
       ->order('users.date_created ASC'); 
     return $this->userRepository->getAdapter()->fetchAll($select); 
    } 

Что мне нужно изменить так, что она возвращает всех пользователей, даже если они не имеют каких-либо запросов и возвращает 0 для столбца запросов, а не общее количество запросов. Я пробовал joinLeft, joinRight, joinInner .... Я не парень SQL, поэтому я немного в тупике.

+0

Используйте 'OUTER JOIN', например. 'LEFT JOIN'. См. Http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – peterm

+0

Спасибо, что сработало, но оно возвращает 1 для пользователей, у которых нет запросов, вместо этого of 0. Любые идеи? –

ответ

1

Во-первых,, чтобы указать всех пользователей OUTER JOIN, например. LEFT JOIN

Во-вторых изменение

COUNT(*) 

в

COUNT(recommendation_requests.user_id) 

Поскольку вы используете OUTER JOIN всегда иметь по крайней мере одну строку в вашем результирующем для каждого пользователя, и поэтому COUNT(*) дает 1 вместо 0 для пользователей, у которых нет запросов. Вместо этого вам нужно подсчитать значения recommendation_requests.user_id.

+0

Отлично, спасибо. –

Смежные вопросы