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

私は父、母、妹のすべての写真を見てきました。テーブル 2 には、それらの写真を見たことを示す行があります。

このコードでは、やりたいことができません。

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

でも、私の母、父、妹は他の写真を見たことがないので、それは間違いです。

これどうやってするの?

ありがとう。

4

1 に答える 1

0

私が正しく理解している場合は、ユーザーが table2 で見たことのない table1 の写真を表示したいと考えています。

これを行うには、画像の一意のリストとユーザーの一意のリストを取得する必要があります。

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 に記録されているように)。これを行うには、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

于 2013-01-02T23:11:18.073 に答える