2015-08-14 2 views
0

Используя PHP и MySQL, я создаю систему обмена сообщениями Inbox, и она работает, но в каком-то смысле она возвращает удвоения. Входящие должны отображать разговор между двумя людьми с последним отправленным сообщением. Пользователь может нажать на это последнее сообщение и пообщаться с пользователем. Сейчас в папке «Входящие» отображается последнее сообщение, отправленное пользователем 1, если пользователь 1 сообщает пользователю 2, и он показывает последнее сообщение, если пользователь 2 messaged user 1. Если пользователь 1 или пользователь 2 сообщают друг другу, я просто хочу показать LAST, отправленное одним из них. Вот мой запрос, я хотел сделать это самостоятельно, но мои навыки SQL немного притупили.MySQL Входящие запросы, возвращающие двойные результаты

Вот мое сообщение таблица: enter image description here

Вот мой пользователь таблице: enter image description here

Наконец, вот запрос:

SELECT m.body, m.createddate,m.recuserid,m.createduserid, 
    FROM(SELECT MAX(createddate) as maxdate 
    from 

    messages 

    group by recuserid,createduserid 
    ) c 
inner join messages m on m.createddate = c.maxdate 
inner join users u on u.userid = m.createduserid 

WHERE createduserid = 143 OR recuserid = 143 

А вот результаты, которые она возвращает : enter image description here

Как вы может видеть, он возвращает любое сообщение, которое вовлекает пользователя 143 любым способом. Мои желаемые результаты состоят в том, чтобы возвращать только 1-й и 3-й строки.

+1

Вы получаете то, о чем просили. строки, где createduserid равно 143, ** OR **, где recuserid равно 143. –

+0

@xQbert возвращает третий результат, но не возвращает первый (я сам передаю сообщения) – triswill227

+0

@MarcB Я это понимаю, но как это исправить? – triswill227

ответ

1

Я думаю, что это то, что вы после:

SELECT m.`body`, 
     MAX(m.`createddate`) AS maxcreateddate, 
     m.`pairid` 
FROM (SELECT `body`, 
      `createddate`, 
      CONCAT(`recuserid`,`createduserid`) as pairid 
     FROM `messages` 
     WHERE `recuserid`=143 
    UNION 
     SELECT `body`, 
      `createddate`, 
      CONCAT(`createduserid`,`recuserid`) as pairid 
     FROM `messages` 
     WHERE `createduserid`=143) as m 
GROUP BY pairid; 

Кто-то может поджарить меня о производительности, но это даст вам результат, который вы ищете для (только первая и третья строки).

Надеюсь, что это поможет;)

+0

Спасибо человеку :) Удивительный никогда не видел, чтобы кто-то использовал concat таким образом – triswill227

0
SELECT m.body, m.createddate,m.recuserid,m.createduserid, 
    FROM (SELECT MAX(createddate) as Maxdate, recuserID, createduserId 
      FROM MESSAGES 
      GROUP BY recuserid,createduserid) c 
INNER JOIN messages m 
    on m.createddate = c.Maxdate 
    and m.RecUserID = C.RecuserId 
    and m.CreateduserId = C.CreatedUserId 
INNER JOIN users u 
    on u.userid = m.createduserid 
WHERE createduserid = 143 

У вас есть заявление OR, из-за чего возвращается вторая строка. как @MarcB заявил в первоначальном комментарии.

Однако из-за возможных совпадений по дате/времени, вы должны вернуть то, что вы группировки, и добавить его к вступлению критериев, а ..

Может быть, вы просто хотите, самое последнее сообщение, посланное пользователем или получил ....

SELECT m.body, m.createddate,m.recuserid,m.createduserid, 
    FROM (SELECT MAX(createddate) as Maxdate, 
      FROM MESSAGES 
      where createdUserID =143 OR RecUserID = 143) c 
INNER JOIN messages m 
    on m.createddate = c.Maxdate 
INNER JOIN users u 
    on u.userid = m.createduserid 
WHERE createduserid = 143 
+0

это работает несколько, но не возвращает последнее сообщение и вместо этого первое? – triswill227

+0

Что вы после? OLDest сообщение или NEW? Это должно возвращать сообщение NEWest для каждой комбинации recuserId и createduserId. – xQbert

+0

самое новое сообщение – triswill227

Смежные вопросы