$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表。
如果您已经不喜欢或喜欢用户,我不希望他们出现在我的搜索结果中。我能想到处理这个问题的唯一方法是执行第二个查询,然后检查这个,然后做另一个随机的查询。查询您是否已经喜欢/不喜欢它们,以便您只看到尚未评级的用户。还有更好的方法吗?
非常感谢任何帮助:)
答案 0 :(得分:1)
这不是答案,但我没有什么建议。
您可以将喜欢/不喜欢改为数字,-1(不喜欢),0或NULL(未分级),1(例如)。
它应该简化/缩短您的查询。
在此之后 - 你可以创建视图/查询(甚至更好的 - SQL函数),它将计算2个用户的评级总和,如果你考虑的话,这样的总和可以用于许多任务。
答案 1 :(得分:1)
您是否听说过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
语句而不将值绑定为有点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();