1

I am working on a friendship logic, the table friendship has this structure:

`friendship_id` INT NOT NULL ,
 `user1_id` INT NOT NULL ,
 `user2_id` INT NOT NULL ,
 `status` INT NULL ,
 `created` DATETIME NULL ,
 `message` VARCHAR(255) NULL ,

And the profile table.

`profile_id` INT NOT NULL ,
 `user_id` INT NOT NULL ,
 `first_name` VARCHAR(255) NULL ,
 `last_name` VARCHAR(255) NULL ,
 `image_url` VARCHAR(255) NULL ,
 `gender` INT NULL ,
 `city_id` INT NULL ,
 `country_id` INT NULL ,

I am trying to get a list of the the friends of a certain user, but I want related info also, for example their city.

The problem is the user_id could be either in user1_id or user2_id.

I can try with a left join but the results are not ok:

select
 city.name,
 p1.first_name as 'user1_first_name',
 p1.last_name as 'user1_last_name',
 p1.user_id as 'user1_id',
 p1.profile_id as 'user1_profile_id',
 p1.image_url as 'user1_image',
 p2.first_name as 'user2_first_name',
 p2.last_name as 'user2_last_name',
 p2.user_id as 'user2_id',
 p2.profile_id as 'user2_profile_id',
 p2.image_url as 'user2_image'
 from friendship f
 left join profile p1 on p1.user_id = user1_id
 left join profile p2 on p2.user_id = user2_id
 left join city on p1.user_id = 1 and city.city_id = p1.city_id or city.city_id = p2.city_id
 where f.user1_id = 1 or f.user2_id = 1 and f.status = 2

Note: Probably my sql is not the best thing you'll ever see :)

What's the best way to get the information?

asked Jul 10, 2013 at 9:45

1 Answer 1

3

It looks like some of your difficulty may be order of operations related. For example, your

where f.user1_id = 1 or f.user2_id = 1 and f.status = 2

is evaluated as

where f.user1_id = 1 or (f.user2_id = 1 and f.status = 2)

It may be more straightforward to start from the profile table of the user you're starting from :

from [profile] p1
left join city c
 on p1.city_id = c.city_id
left join friendship f
 on p1.[user_id] in (f.user1_id,f.user2_id)
 and f.[status] = 2
left join [profile] p2
 on p2.[user_id] in (f.user1_id,f.user2_id)
 and p1.[user_id] <> p2.[user_id]
where p1.[user_id] = 1
answered Jul 10, 2013 at 18:32

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.