#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 идентификатором пользователя.