0

我正在制作一个约会应用程序,很像 tinder。用户可以喜欢或不喜欢其他用户,如果两个用户都喜欢对方,他们可以选择互相聊天。目前正在构建查询以随机提取随机配置文件和其中一张图片:

$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 表。

如果您已经不喜欢或喜欢某个用户,我不希望他们出现在我的结果中。我能想到的唯一方法是执行第二个查询来检查它,然后如果您已经喜欢/不喜欢它们,则执行另一个“随机”查询,这样您就只能看到您尚未评分的用户。有没有更好的办法?

任何帮助深表感谢 :)

4

3 回答 3

1

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

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

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

在此之后 - 您可以创建视图/查询(甚至更好 - SQL 函数)来计算 2 个用户的评分总和,如果您考虑一下,这样的总和可能会用于许多任务。

于 2013-05-21T23:23:14.390 回答
1

你听说过EXISTSandNOT 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有点笨拙。

通过谷歌进行的简短调查(现在可能已经过时)表明以下内容应该是合适的。

//...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);

于 2013-05-22T00:48:18.970 回答
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();
于 2013-05-22T00:02:52.200 回答