codeigniter complex join только если строк не существует

Я делаю приложение для знакомств, похожее на tindler. Пользователи могут любить или не любить других пользователей, и если оба пользователя одинаково похожи друг на друга, они получают возможность общаться с афористом. В настоящее время строит запрос, чтобы случайным образом вывести произвольный профиль и одну из своих картин:

$data = $this->db ->select('users.id,display_name,city,state,gender,users_pictures.picture') ->join('users_pictures','users_pictures.user_id = users.id') ->order_by('id','RANDOM') ->limit(1) ->where(array('users.approved'=>1,'users_pictures.approved'=>1)) ->where(array('users.id !='=>$user_id))->get('users')->result_array(); 

Теперь вот где я запутался .. У меня есть таблица для lik_dislikes, которая состоит из user_id, foreign_user_id и event_type (например, не нравится).

Если вы уже не любили или любили пользователя, я не хочу, чтобы они были в моих результатах. Единственное средство, которое я могу решить, это выполнить второй запрос, который проверяет это, а затем выполняет другой «случайный» запрос, если вы уже любили / не любили их, чтобы вы видели только тех пользователей, которых вы еще не оценили. Есть ли способ лучше?

Любая помощь высоко ценится 🙂

Вы слышали о EXISTS и NOT EXISTS MySQL команды? Последний – тот, который вы должны попробовать.

 SELECT u.id, display_name, city, state, gender, up.picture FROM users AS u INNER JOIN users_pictures AS up ON up.user_id = u.id WHERE NOT EXISTS( SELECT 1 FROM likes_dislikes WHERE ld.foreign_user_id = u.id AND ld.user_id = $loggedInUserId ) 

В приведенном выше списке будут перечислены все пользователи, за исключением всех любимых / нелюбимых пользователей. Попытка сформировать эту инструкцию SQL с помощью Codeigniter без Codeigniter значения немного взломана.

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

 //...rest of query $db->where(" NOT EXISTS ( SELECT 1 FROM likes_dislikes WHERE ld.foreign_user_id = u.id AND ld.user_id = $loggedInUserId ) AND 1 = ", 1); 

Обратите внимание на последнюю часть AND 1 = ", 1);

Это не ответ, но у меня мало предложений.

Вы можете изменить как / неприязнь к числам, -1 (не нравится), 0 или NULL (без рейтинга), 1 (например), например.

Он должен упростить / сократить ваши запросы.

После этого вы можете создать представление / запрос (или даже лучше – функцию SQL), который будет вычислять сумму рейтингов двух пользователей, и сумма, подобная этому, может использоваться для многих задач, если вы думаете об этом.

Если вы используете левое внешнее соединение, вы получите записи в левой таблице, которые НЕ имеют соответствия в правой таблице. (Как указано здесь http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/ )

Вы можете указать этот тип соединения с помощью третьего параметра функции активной записи join () CodeIgniter.

Таким образом, попробуйте использовать что-то вроде:

 $data = $this->db ->select('users.id,display_name,city,state,gender,users_pictures.picture') ->join('users_pictures','users_pictures.user_id = users.id') ->join('likes_dislikes', 'likes_dislikes.user_id = users.id', 'left outer') ->order_by('id','RANDOM') ->limit(1) ->where(array('users.approved'=>1,'users_pictures.approved'=>1)) ->where(array('users.id !='=>$user_id))->get('users')->result_array();