【问题标题】:Select items the user does NOT like选择用户不喜欢的项目
【发布时间】:2015-02-16 18:56:10
【问题描述】:

在我的网站中,我有一个用户表,主键是username。我有一个专辑表,其中包含专辑 ID 和专辑标题。我还有一个 user_albums 表,它模拟了许多用户之间的关系,比如许多专辑。

这是一个返回特定用户喜欢的专辑的选择查询:

SELECT e.album_title
FROM user_albums d
INNER JOIN albums e ON d.album_id = e.album_id
WHERE d.user_id = $user

我想要的是相同的查询,但我希望它返回他喜欢的所有专辑。所以基本上,选择所有不在该查询中的专辑。

我需要改变什么才能做到这一点?

【问题讨论】:

标签: php sql postgresql


【解决方案1】:

这转换为不存在,“此用户的 id 未在 user_albums 中列出”:

SELECT e.album_title FROM albums e 
WHERE NOT EXISTS
 ( SELECT * FROM user_albums d 
    WHERE d.user_id = '$user'
      AND d.album_id = e.album_id
 )

如果您不想使用子查询,常用的方法是使用 OUTER JOIN/IS NULL:

SELECT e.album_title 
FROM user_albums d 
LEFT JOIN albums e 
ON d.album_id = e.album_id 
AND d.user_id = '$user' -- when there's no match a NULL will be returned
WHERE d.album_id IS NULL; -- find that NULL

【讨论】:

  • 有没有办法在没有子查询的情况下做到这一点。
  • @Milo。这样的查询通常使用子查询更容易阅读。 EXISTS 使用相关子查询,即您在该子查询中引用外部表。您可以对带有 IN:WHERE album_id NOT IN (select album_id from user_albums where user_id = '$user') 的非相关子查询执行相同操作,我认为它更具可读性。
  • @Thorsten Kettner:当然 NOT IN 更容易阅读,但 NOT EXISTS 无论可能的 NULL 是什么都有效 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2014-05-05
  • 2020-07-11
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多