0

我有一个主页,用户可以在其中发布照片。DB 有 4 个用户的 2 个表(也许它们构建得很糟糕)。我使用 MySQL。

表格1

id  |  photo |  user
1   |  a     |  me
2   |  b     |  dad
3   |  c     |  mom
4   |  d     |  sister

表2

id  |  photo |  user
1   |  a     |  me
2   |  b     |  me
3   |  c     |  me

我看过我爸爸、妈妈和姐姐的每张照片,然后,table2 有行表示我看过这些照片。

使用此代码,我无法做我想做的事。

select * from table1 where photo not in (select photo from table2)

但是,我的妈妈,爸爸和姐姐没有看到其他照片,所以这是一个错误,他们应该可以看到彼此的照片,他们不能。

我怎样才能做到这一点?

谢谢。

4

1 回答 1

0

如果我理解正确,您希望在 table1 中显示用户未在 table2 中看到的照片。

为此,您需要获取唯一的图片列表和唯一的用户列表:

SELECT DISTINCT [user] FROM table1
SELECT DISTINCT [photo] FROM table1

然后,我们希望将这些结果结合在一起:

SELECT  *
FROM (SELECT DISTINCT [user] FROM #table1) users
JOIN (SELECT DISTINCT [photo] FROM #table1) photos ON 1=1

1=1意味着我们将每张照片与每个用户连接起来。

这将为您提供每张照片和每个用户的列表:

USER | PHOTO
dad    a
dad    c
dad    b
dad    d
me     a
me     b
me     c
me     d
mom    a
mom    b
mom    c
mom    d
Sister a
Sister b
Sister c
Sister d

最后一步是过滤掉您已经看过的照片(如表 2 中记录的)。为此,我们将 join 留给 table2 并找到所有空值:

SELECT  *
FROM (SELECT DISTINCT [user] FROM table1) users
JOIN (SELECT DISTINCT [photo] FROM table1) photos ON 1=1
LEFT JOIN table2 ON photos.photo = table2.photo AND table2.[user] = users.[user]
WHERE table2.id IS NULL

相反,如果您想查看每个用户看过哪些图片,请将 where 子句更改为WHERE table2.id IS NOT NULL

于 2013-01-02T23:11:18.073 回答