仅当行不存在时,codeigniter复合连接

时间:2013-05-21 22:39:08

标签: php codeigniter

我正在制作一个约会应用程序,就像温德勒一样。用户可以喜欢或不喜欢其他用户,如果两个用户都喜欢彼此,他们就可以选择互相聊天。目前正在构建查询以随机抽取随机配置文件及其中一张图片:

$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();    

现在我感到很困惑。我有一个包含user_id,foreign_user_id和event_type(喜欢,不喜欢)的likes_dislikes表。

如果您已经不喜欢或喜欢用户,我不希望他们出现在我的搜索结果中。我能想到处理这个问题的唯一方法是执行第二个查询,然后检查这个,然后做另一个随机的查询。查询您是否已经喜欢/不喜欢它们,以便您只看到尚未评级的用户。还有更好的方法吗?

非常感谢任何帮助:)

3 个答案:

答案 0 :(得分:1)

这不是答案,但我没有什么建议。

您可以将喜欢/不喜欢改为数字,-1(不喜欢),0或NULL(未分级),1(例如)。

它应该简化/缩短您的查询。

在此之后 - 你可以创建视图/查询(甚至更好的 - SQL函数),它将计算2个用户的评级总和,如果你考虑的话,这样的总和可以用于许多任务。

答案 1 :(得分:1)

您是否听说过EXISTSNOT 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语句而不将值绑定为有点hacky。

通过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);

答案 2 :(得分:0)

如果使用左外连接,则会在左表中获得右表中没有匹配项的记录。 (如此处所述http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/

您可以通过CodeIgniter的活动记录join()函数的第三个参数指定此连接类型。

因此,尝试使用类似的东西:

$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();