Mysql连接在一个表中的特定记录不在其他表中

时间:2015-05-08 04:06:12

标签: mysql sql join

我已经查看过“一个表中的数据而不是其他SQL”的其他示例,但仍然无法解决这个问题。

表“图片”包含:

  • “id”,此图片的自动增量ID号
  • “owner”,指向唯一身份用户的ID号

表“评级”包含:

  • “picture”,对“图片”表中条目的引用
  • “userby”,一个引用唯一用户的ID号

我想选择特定用户中评分表中没有条目的所有图片,而图片所有者不是该用户。

例如,我可能想要选择用户5未评级但不是所有者的所有图片。

通常这将是图片和评级之间的连接,并检查评级记录是否为空,但我似乎无法仅为特定用户做到这一点。

我该怎么做?我希望尽可能避免使用子选择。谢谢。

2 个答案:

答案 0 :(得分:3)

您需要将其他检查添加到连接谓词,而不是在where子句中。

类似

SELECT *
FROM pictures p LEFT JOIN
ratings r ON p.ID = r.PictureID AND r.UserID = 5 
WHERE r.ID IS NULL
AND p.OwnerID <> 5

看看这个例子

SQL Fiddle DEMO

答案 1 :(得分:0)

select * 
from pictures as p
where p.owner <> 5
  and not exists(select * from ratings where picture = p.id and userby = 5)
  1. 首先选择不属于用户p.owner <> 5
  2. 的图片
  3. 然后按用户exists(subquery)
  4. 搜索该图片的评分
  5. 如果需要没有评级的图片,请使用
  6. 不幸的是,你需要的结果不能通过一步组合(没有子选择)产生,因为这样做需要一个操作,它可以组合存在的东西(任何不属于用户的图片)与不存在的东西(用户缺少评级) 。

    如果有一些表包含用户没有评价某些图片的事实,那么就有可能! SQL可以使用仅存在的东西进行操作。这不是exists(subquery)所做的 - 它意识到用户没有对图片给出评级这一事实。