那么,假设我有一个 users
table 和一个 pages
table 。假设我想允许用户隐藏/忘记/忽略某些页面。在这一点上,我可以想到两种可能的方法:
与null
的外部连接匹配:
我可以创建一个单独的 ignored_pages
带列的表格 user_id
和 page_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/