我有一个主页面,用户可以在其中发布照片。 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)
然而,我的妈妈,爸爸和妹妹没有看到其他照片,所以这是一个错误,他们应该能够看到彼此的照片,但他们不能。
我该怎么做?
感谢。
答案 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