Осталось соединить один стол с самим собой - PullRequest
2 голосов
/ 16 февраля 2012
SELECT s1.receiverID, s2.senderID
FROM messages as s1
LEFT JOIN messages as s2 ON s1.receiverID = s2.senderID

Я хочу объединить таблицу «сообщений», в которой senderID и receiveID одинаковы, чтобы добиться чего-то вроде потока разговоров, но когда я запускаю это, он возвращает 10 422 строк. Когда все строки 3000, так как же он возвращает больше ?!

// Пример сценария: пользователь с id = 8 переходит на этот URL-адрес sample.com/inbox/user=275. И я хочу показать все сообщения между ними, чтобы добиться чего-то вроде потока разговоров / чата.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

ты не хочешь присоединиться. Вы просто хотите получить все сообщения, в которых оба пользователя являются отправителем и получателем.

select * -- (or whatever)
from messages
where
(senderid = [userId] and receiverid = [otherUserId])
or (senderid = [otherUserId] and receiverid = [userId])

объединение, как вы написали, говорит: «дайте мне каждую комбинацию сообщений в системе, где отправитель одного сообщения совпадает с получателем другого и если есть кто-то, кто получил сообщение, но не отправил , покажите мне те же значения с нулевыми значениями для отправителя. "

1 голос
/ 16 февраля 2012

Может быть, это то, что вы на самом деле ищете?

select t1.senderID as t1senderID, t1.receiverID as t1receiverID,
  t2.senderID as t2senderID, t2.receiverID as t2receiverID
from messages t1
join messages t2
on t1.senderID = t2.receiverID and t1.receiverID = t2.senderID

Пример даты очень поможет.

Редактировать:

Учитывая этот комментарий:

У нас есть пользователь A и пользователь B, и я хочу вернуть все сообщения между ними

Вы ищете это:

select * from t1
where (senderID = 'A' and receiverID = 'B') or
      (senderID = 'B' and receiverID = 'A')
0 голосов
/ 16 февраля 2012

Этот пример может помочь вам понять, почему после объединения получается больше строк.

rID sID
1   2
1   3
2   1
3   1

s1.rID s1.sID s2.rID s2.sID
1      2      2      1
1      2      3      1
1      3      2      1
1      3      3      1
2      1      1      2
3      1      1      3
...