我目前正在开发一个网站,该网站允许用户通过显示或隐藏他们已经购买的商品来过滤市场。这适用于通过这些可用筛选器的当前条件的基本 AJAX 调用,然后使用 CodeIgniter 的活动记录构建相应的查询。
我的问题是围绕查询进行思考,以便如果用户选择隐藏购买的项目,查询会省略/忽略任何相关记录(即,如果user_id = 5
和隐藏购买是真的,则查询中不会返回user_id = 5
拥有的任何场景(。
Tbl:场景
-------------------------------------------------------------------------
| design_id | scene_id | scene_name | ... [irrelevant columns to the Q] |
|-----------|----------|------------|-----------------------------------|
| 1 | 1 | welcome | |
| 1 | 2 | hello | |
| 2 | 3 | asd | |
-------------------------------------------------------------------------
设计表与此非常相似,包括对游戏、游戏类型、设计名称等的引用。
电话: user_scenes
----------------------------------------------------------------------
| design_id | scene_id | user_id | ... [irrelevant columns to the Q] |
|-----------|----------|---------|-----------------------------------|
| 1 | 1 | 5 | |
| 1 | 2 | 5 | |
| 1 | 1 | 9 | |
----------------------------------------------------------------------
查询
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
查询使用CodeIgniter的活动记录($this->db->select() / $this->db->where()
(,但这有点无关紧要。
--
我已经尝试过诸如INNER JOIN
之类的事情,例如使用user_scenes
然后按scene_id分组,但这会带来一个问题,即仅返回user_scenes
中存在的场景。然后我尝试了一个子查询,但随后质疑这是否是正确的路线。
我知道还有其他方法 - 循环访问返回的数据并查询该记录是否存在于特定用户,但我怀疑效率非常低。因此,我不知道该尝试什么,并希望得到任何帮助。
我不知道
您的设置是否允许,但我会做一个子选择:
通过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
有点我想第一种方法更快。