省略/忽略用户购买的任何记录

时间:2014-11-30 15:37:15

标签: php mysql codeigniter

我目前正在开发一个网站,其中包括允许用户通过显示或隐藏他们已购买的商品来过滤市场。这适用于基本的AJAX调用,该调用通过可用的那些过滤器的当前条件,然后使用CodeIgniter的活动记录,它构建适当的查询。

我的问题是围绕查询,以便如果用户选择隐藏购买的项目,查询将忽略/忽略任何相关记录(即,如果user_id = 5和隐藏购买是真的,那么{{1在查询中不返回所有者。

Tbl:场景

user_id = 5

设计表与此非常相似,包括对游戏,游戏类型,设计名称等的引用。

Tbl:user_scenes

-------------------------------------------------------------------------
| design_id | scene_id | scene_name | ... [irrelevant columns to the Q] |
|-----------|----------|------------|-----------------------------------|
|     1     |     1    |  welcome   |                                   |
|     1     |     2    |   hello    |                                   |
|     2     |     3    |    asd     |                                   |
-------------------------------------------------------------------------

查询

----------------------------------------------------------------------
| design_id | scene_id | user_id | ... [irrelevant columns to the Q] |
|-----------|----------|---------|-----------------------------------|
|     1     |     1    |    5    |                                   |
|     1     |     2    |    5    |                                   |
|     1     |     1    |    9    |                                   |
----------------------------------------------------------------------

查询使用CodeIgniter的活动记录(SELECT `designs`.`design_id`, `designs`.`design_name`, `scenes`.`scene_id`, `scenes`.`scene_name`, `scenes`.`scene_description`, `scenes`.`scene_unique_code`, `scenes`.`date_created`, `scenes`.`scene_cost`, `scenes`.`type`, `games`.`game_title`, `games`.`game_title_short`, `games_genres`.`genre` FROM (`scenes`) JOIN `designs` ON `designs`.`design_id` = `scenes`.`design_id` JOIN `games` ON `designs`.`game_id` = `games`.`game_id` JOIN `games_genres` ON `games`.`genre_id` = `games_genres`.`genre_id` WHERE `scenes`.`private` = 0 ORDER BY `designs`.`design_name` asc, `scenes`.`scene_name` asc LIMIT 6 ),但这有点无关紧要。

-

我尝试使用$this->db->select() / $this->db->where()INNER JOIN之类的内容然后按scene_id进行分组,但这只会导致user_scenes中只返回场景的问题。然后我尝试了一个子查询,但随后质疑这是否是正确的路线。

我知道还有其他方法 - 循环返回数据并查询特定用户是否存在该记录,但我怀疑这种记录效率非常低。因此,我不知道该尝试什么,并希望得到任何帮助。

1 个答案:

答案 0 :(得分:1)

我不知道你的设置是否允许,但我会做一个子选择:

通过NOT IN

SELECT * FROM `scenes` 
    WHERE `scenes`.`scene_id` NOT IN (SELECT `scene_id` FROM `user_scenes` WHERE `user_id` = 5)

或者可能通过LEFT JOIN

SELECT * FROM `scenes` 
    LEFT JOIN (SELECT `scene_id`, `user_id` FROM `user_scenes` WHERE `user_id` = 5) AS `user_scenes`
    ON `scenes`.`scene_id` = `user_scenes`.`scene_id`
WHERE `user_scenes`.`user_id` IS NULL
我猜第一种方式更快。<​​/ p>