SQL - 对于某些用户,从2个表中选择不重复的行?

时间:2013-01-02 21:50:40

标签: sql

我有一个主页面,用户可以在其中发布照片。 DB有2个表(可能它们构建得很糟糕)有4个用户。我使用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

我看过我爸爸,妈妈和妹妹的每张照片,然后,桌子2有行表示我看过那些照片。

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

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

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

我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:0)

如果我正确地取消正确,您希望在table1中显示用户未在表2中看到的照片。

要做到这一点,您需要获得一个独特的图片列表和一个唯一的用户列表:

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并找到所有null:

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