【发布时间】:2011-06-22 20:53:33
【问题描述】:
所以,假设我有一个 users 表和一个 pages 表。假设我想让用户隐藏/忘记/忽略某些页面。在这一点上,我可以想到两种可能的方法:
与null匹配的外连接:
我可以创建一个单独的ignored_pages 表,其中包含user_id 和page_id 列,当ID 为1 的用户忽略ID 为2 的页面时写入INSERT INTO ignored_pages (user_id, page_id) VALUES (1,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); 之类的东西。
是否有最佳实践或一系列经验法则或(可能)比我正在采用的更好的方法来解决这个问题?
【问题讨论】:
标签: sql ruby-on-rails postgresql