1

私は友人とテーブルの写真と呼ばれるテーブルを持っています。友達の写真または友達の写真を持っているユーザーを照会しようとしています。friendsテーブルで内部結合をエイリアスする必要があると思いますが、よくわかりません

Friends Table
user_id int
friend_id int 
[other attribute field]

Photos Table
id      int
user_id int
[other attribute field]

たとえば、友人の写真をクエリしたい場合は、実行します

SELECT `photos`.`id` FROM `photos` LEFT JOIN `friends` ON (`friends`.`friend_id` = `photos`.`user_id`) WHERE `friends`.`user_id` = 1

または、ユーザー テーブル ID だけをクエリしたい場合は、

SELECT `photos`.`id` FROM `photos` WHERE `photos`.`user_id` = 1

問題は、同じ結果セットで両方を取得しようとしたときです

SELECT  `photos`.`id` 
FROM  `photos` 
LEFT JOIN  `friends` ON (  `friends`.`friend_id` =  `photos`.`user_id` ) 
WHERE  `friends`.`user_id` =1
OR  `photos`.`user_id` =1
LIMIT 0 , 30

左の結合のために、明らかに間違った結果が得られます。私が持っているすべての友人に対して結果が得られます

OR句などのために別名テーブルを内部結合する必要があると考えていますが、それを理解できません。

4

3 に答える 3

2

最初の 2 つのクエリに UNION を使用するとどうなるでしょうか。

SELECT `photos`.`id` 
   FROM `photos` 
        LEFT JOIN `friends` ON (`friends`.`friend_id` = `photos`.`user_id`) 
   WHERE `friends`.`user_id` = 1
union all 
SELECT `photos`.`id` FROM `photos` WHERE `photos`.`user_id` = 1

UNION を使用したくない場合は、

SELECT `photos`.`id` 
   FROM `photos` where `photos`.`user_id`=1
                   or `photos`.`user_id` 
                       in (select `friends`.`friend_id` from `friends`
                                             where `friends`.`user_id` = 1)
于 2012-12-12T10:15:46.627 に答える
1

この問題には組合が最善のアプローチだと思います。

または、「OR」を指定してサブクエリを使用してみてください

SELECT photos.id FROM photos WHERE 
(photos.user_id = 1) or 
(photos.user_id in (select friends.friend_id from friends where friends.user_id=1))
于 2012-12-12T10:49:04.380 に答える
0

あなたが示したものについては、まったく必要ありませんJOINphotosテーブルには既にユーザーIDが含まれているため、表示されているものにはテーブルfriendsは必要ありません。photos特定のユーザーの写真を取得するには、直接クエリを実行するだけです。

誰かが実際に友達である場合にのみ写真を返すなど、本当に別のことを望んでいるかもしれません. その場合、inner join左結合ではなく、次のようにする必要があります。

SELECT  `photos`.`id` 
FROM  `photos` 
INNER JOIN  `friends` ON
  `friends`.`friend_id` =  `photos`.`user_id`  AND
  `friends`.`user_id` =1
LIMIT 0 , 30

ID 1 の友達の写真と、その人が友達であるかどうかに関係なくユーザー ID 2 の写真を返したい場合は、次のようにします。

SELECT  `photos`.`id` 
FROM  `photos` 
LEFT JOIN  `friends` ON
  `friends`.`friend_id` =  `photos`.`user_id`  AND
  `friends`.`user_id` = 1
WHERE
  `friends`.`friend_id` IS NOT NULL OR
  `photos`.`user_id` = 2
LIMIT 0 , 30
于 2012-12-12T10:15:22.467 に答える