выбор уникальных строк из одной таблицы в соответствии с другой таблицей и последующая ее сортировка

#mysql #sql

#mysql — сервер #sql

Вопрос:

У меня есть два стола:

 communications:
--------------------------------------------------
id  |   subject     |   timestamp   |   starter
--------------------------------------------------

messagepartners
-------------------------------------------------
id  |   commid      |   userid  |   type
-------------------------------------------------
  

в таблице messagepartners хранятся идентификаторы пользователей, участвующих в беседе (хранятся в таблице communications).
столбец commid в messagepartners хранит соответствующий идентификатор связи (идентификатор столбца в сообщениях).

для конкретного пользователя с идентификатором userid я хочу получить список сообщений, в которых участвует userid. список не должен содержать дубликатов и быть отсортирован по временной метке.

как я должен написать sql-запрос для этого? Спасибо

Комментарии:

1. вы должны использовать объединение. вы вообще что-нибудь пробовали? это простой sql.

Ответ №1:

Сделайте это поэтапно

Вот способ объединения таблиц

 SELECT *
FROM communications as c
JOIN messagepartners as p on c.id = p.commid
  

Фильтровать по идентификатору пользователя

 SELECT *
FROM communications as c
JOIN messagepartners as p on c.id = p.commid
WHERE p.userid = X
  

Данные, которые нам нужны

 SELECT c.id, c.subject, c.timestamp
FROM communications as c
JOIN messagepartners as p on c.id = p.commid
WHERE p.userid = X
  

никаких дублей

 SELECT DISTINCT c.id, c.subject, c.timestamp
FROM communications as c
JOIN messagepartners as p on c.id = p.commid
WHERE p.userid = X
  

Я предлагаю выполнить каждый из этих шагов и понять, почему вы получаете те результаты, которые вы делаете на каждом шаге.

Ответ №2:

Следующий запрос делает то, что вы хотите:

 SELECT 
    b.*
FROM
    (
        SELECT
            commid
        FROM
            messagepartners
        WHERE 
            userid = 1234
        GROUP BY
            commid
    ) a
    INNER JOIN communications b ON (a.commid = b.id)
ORDER BY
    B.timestamp
;
  

Не забудьте заменить 1234 идентификатором пользователя.