sql - 我应该如何处理 "forget this"功能背后的数据库逻辑?

标签 sql ruby-on-rails postgresql

那么,假设我有一个 users table 和一个 pages table 。假设我想允许用户隐藏/忘记/忽略某些页面。在这一点上,我可以想到两种可能的方法:

null 的外部连接匹配:

我可以创建一个单独的 ignored_pages带列的表格 user_idpage_id , 写给它 INSERT INTO ignored_pages (user_id, page_id) VALUES (1,2);当 ID 为 1 的用户忽略 ID 为 2 的页面时。

然后我可以运行类似 SELECT pages.* FROM pages LEFT OUTER JOIN ignored_pages ON pages.id = ignored_pages.page_id WHERE ignored_pages.user_id = 1 AND ignored_pages.id IS NULL; 的程序

编辑: Joe Stefanelli指出了我的查询中的一个错误。应该是SELECT pages.* FROM pages LEFT OUTER JOIN ignored_pages ON pages.id = ignored_pages.page_id AND ignored_pages.user_id = 1 WHERE ignored_pages.id IS NULL;

子查询和NOT IN :

我可以使用相同的多对多表,然后运行类似 SELECT pages.* FROM pages WHERE page_id NOT IN (SELECT page_id FROM ignored_pages WHERE user_id = 1); 的程序.


是否有最佳实践或一系列经验法则或(可能)比我正在采用的方法更好的方法来解决这个问题?

最佳答案

您的最佳表现实际上可能是NOT EXISTS

SELECT p.* 
    FROM pages p
    WHERE NOT EXISTS(SELECT 1 
                         FROM ignored_pages 
                         WHERE user_id = 1 
                             AND page_id = p.id);

如果您决定坚持使用 LEFT JOIN 选项,则需要更正该查询以在连接条件而不是 WHERE 上测试 user_id 子句。

SELECT pages.* 
    FROM pages 
        LEFT OUTER JOIN ignored_pages 
            ON pages.id = ignored_pages.page_id 
                AND ignored_pages.user_id = 1 
    WHERE ignored_pages.id IS NULL;

关于sql - 我应该如何处理 "forget this"功能背后的数据库逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446430/

相关文章:

ruby-on-rails - 迪尔德 : Symbol not found: _rb_ary_new_from_values When trying to run foreman start

css - rails 和 CSS : best to have css for each controller or all in application. CSS?

php - 使用 PDO 准备好插入后获取最后一个插入 ID

postgresql - 如何使用 epgsql 驱动程序连接到 Erlang 中的 PostgreSQL?

java - Java 准备语句中的通配符问题

mysql - 使用uuid作为默认值时如何使用LAST_INSERT_ID()?

c# - 我使用分组查询来获得所需的输出

Mysql 按州、邮政编码和 maternitybg(3 个条件)过滤 Wordpress wp_usermeta 表

ruby-on-rails - 如何为所有类编写一个方法

Django PostgreSQL——删除所有表?