Как я могу считать оставшиеся без ответа сообщения за последний год? - PullRequest
0 голосов
/ 24 апреля 2018

Я делаю систему обмена сообщениями. Сообщения бывают двух разных видов.

  • Первые сообщения имеют title и NULL для related столбца.
  • Вторые сообщения относятся к одному из первых сообщений, которые не имеют title и имеют идентификатор родительского сообщения для столбца related. (которые известны как ответ / ответ / ответ)

Вот моя структура таблицы:

// messages
+----+----------+------------------+-----------+-------------+-------------+---------+
| id |  title   |     content      | sender_id | receiver_id |  date_time  | related |
+----+----------+------------------+-----------+-------------+-------------+---------+
| 1  | titel1   | whatever1        | 1         | 3           | 1521097240  | NULL    |
| 2  |          | whatever2        | 3         | 1           | 1521097241  | 1       |
| 3  |          | whatever3        | 1         | 3           | 1521097242  | 1       |
| 4  | title2   | whatever4        | 1         | 4           | 1521097243  | NULL    |
| 5  | title3   | whatever5        | 1         | 5           | 1521097244  | NULL    |
| 6  |          | whatever7        | 4         | 1           | 1521097246  | 4       |
| 7  | title4   | whatever8        | 1         | 4           | 1521097246  | NULL    |
+----+----------+------------------+-----------+-------------+-------------+---------+
/*
  related column: it is NULL for the first message and the id of the parent for othesrs.

Теперь мне нужно посчитать количество сообщений, которые пользователь А отправил и не получил ответа на этот вопрос в прошлом году.

Например, число сообщений, отправленных пользователем user_id = 1, на которые не получен ответ, равно 1. Потому что он отправил сообщение пользователю user_id = 5 и еще не ответил.

Как мне посчитать это число?


SELECT count(1)
FROM messages
WHERE sender_id = 1
  AND date_time > UNIX_TIMESTAMP(DATE_SUB(now(), INTERVAL 1 YEAR))

Мой запрос считает все отправленные сообщения. Как я могу считать только неотвеченные?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Использование NOT EXISTS

SELECT count(1)
FROM messages m1
WHERE sender_id = 1  AND 
      related IS NULL AND
      date_time > UNIX_TIMESTAMP(DATE_SUB(now(), INTERVAL 1 YEAR)) AND
      NOT EXISTS (
          SELECT 1
          FROM messages m2
          WHERE m1.id = m2.related
      )
0 голосов
/ 24 апреля 2018

Позвольте мне предположить, что вы действительно имеете в виду первые сообщения, отправленные "A".Если это так, ваш пример запроса должен быть отфильтрован по related is NULL.Чтобы отфильтровать непринятые ответы, вы можете использовать LEFT JOIN / WHERE или NOT EXISTS:

SELECT count(*)
FROM messages m LEFT JOIN
     messages m2
     ON m2.related = m.id
WHERE m.sender_id = 1 AND
      m.related IS NULL AND
      m.date_time > UNIX_TIMESTAMP(DATE_SUB(now(), INTERVAL 1 YEAR)) AND
      m2.id IS NULL;  -- response does not exist
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...