Reputation: 11
I have the following tables:
users(id, name)
friend(friend1,friend2)
images(name, id)
imageliked(imageId,likedId)
I want to get the images liked by friend of my friend with two select. Can anyone help me.....
Upvotes: -3
Views: 88
Reputation: 79969
Try this:
SELECT DISTINCT
i.*
FROM friend AS f
INNER JOIN imageLiked AS il ON il.likedId IN(f.friend1, f.friend2)
INNER JOIN images AS i ON il.imageId = i.id
WHERE 2 IN(f.friend1, f.friend2); -- 2 is my id for example
Note that: This will include those images liked by you, if you want to remove them, just add AND il.likedId <> yourId
to the WHERE
clause.
To get the images liked by friends of you and by friends of friends:
SELECT DISTINCT
i.*
FROM
(
SELECT f1.friend1 as friend
FROM friend AS f1
INNER JOIN
(
SELECT friend1
FROM friend
WHERE friend2 = 2
UNION ALL
SELECT friend2
FROM friend
WHERE friend1 = 2
) AS f2 ON f2.friend1 IN (f1.friend1, f1.friend2)
UNION
SELECT f1.friend2
FROM friend AS f1
INNER JOIN
(
SELECT friend1
FROM friend
WHERE friend2 = 2
UNION ALL
SELECT friend2
FROM friend
WHERE friend1 = 2
) AS f2 ON f2.friend1 IN (f1.friend1, f1.friend2)
)AS f
INNER JOIN imageLiked AS il ON il.likedId = f.friend
INNER JOIN images AS i ON il.imageId = i.id
WHERE il.likedId <> 2;
To get only images liked by friends of my friends:
SELECT DISTINCT
i.*
FROM
(
SELECT f1.friend2 AS friend
FROM friend AS f1
INNER JOIN
(
SELECT friend1
FROM friend
WHERE friend2 = 2
UNION ALL
SELECT friend2
FROM friend
WHERE friend1 = 2
) AS f2 ON f2.friend1 IN (f1.friend1, f1.friend2)
)AS f
INNER JOIN imageLiked AS il ON il.likedId = f.friend
INNER JOIN images AS i ON il.imageId = i.id
WHERE il.likedId <> 2;
Upvotes: 1