Question

I have a simple chat table. The chat table has a user_id column and a recipient_id column and a boolean agrees_to_chat column.

What I'd like to do, is display the users for which user 1 wants to chat with and whom all other users also want to chat with user 1.

(Note that there will be cases where 1 agrees to chat with 2, but 2 has not gone online to signal a preference yet. Obviously in those cases I don't want a chat to show up.)

Here's what I've come up with so far.

SELECT c1.user_id, c1.recipient_id, c2.user_id, c2.recipient_id FROM chats c1, chats c2 
      WHERE c1.recipient_id = c2.user_id 
        AND c1.user_id = c2.recipient_id 
        AND c2.user_id=1 
        AND c2.agrees_to_chat=true 
        AND c1.agrees_to_chat=true

For some reason setting c2.user_id = 1 results in what I want: records where user_id = 1, along with people who have agreed to chat listed in the recipient_id column.

However if I set it to c1.user_id=1 I get the same results flipped over. Namely, now my results are still people who have agreed to chat, but now the recipient_id = 1 for all results, and the user_id is the different users.

This matters to me because if I want to serve data that shows everyone whose agreed to chat with user 1. But if I decide to reference recipient_id in my code, I need to know that won't change...For example, on my computer I noticed that c2.user_id =1 results in what I want, but in this sql fiddle it seems to be that c1.user_id=1 gets what I need... http://sqlfiddle.com/#!15/799a9/2

So what's going on here? Is there something I'm not understanding about my query? Alternatively is there a better query for what I'm trying to achieve?

Was it helpful?

Solution

You don't need all 4 columns, since you already know 1st and 4th (and 2nd and 3rd) will be equal. Use SELECT c2.user_id, c2.recipient_id FROM ... or SELECT c1.user_id, c1.recipient_id FROM .... In case you actually need several copies of the same column from the self-joined tables, you can give names to them: SELECT c1.user_id AS user_id1, c1.recipient_id AS recipient_id1, c2.user_id AS user_id2, c2.recipient_id AS recipient_id2 FROM ...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top