Как сделать это соединение с несколькими столами? - PullRequest
0 голосов
/ 28 февраля 2011

У меня есть доска обсуждений с темами, сообщениями и пользователями.

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

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

Как создать правильное объединение?Пользователи, сообщения и темы имеют, конечно, идентификатор первичного ключа, который записан в таблицах поиска, например

TABLE `posts_read`
user  | has_read_post | of_thread
---------------------------------
5     | 100           | 3

и

TABLE `subscribed_to`
user  | reads_thread
---------------------
5     | 3

Пример :Пользователь 5 подписан на ветку 3 и прочитал до сообщения 100 из темы 3 и, но в теме 3 теперь есть 200 сообщений, пользователь хочет начать чтение темы 3 с сообщения 101, потому что он на 100 сообщений позади.

Могу ли я сделать это за один шаг?Конечно, она может быть подписана более чем на одну ветку, поэтому мы должны отсортировать, по какой из них самая непрочитанная.

1 Ответ

1 голос
/ 28 февраля 2011

Вот возможный подход к проблеме.Я предполагаю, что posts_read.has_read_post эквивалентен количеству прочитанных сообщений, а не является числом, однозначно идентифицирующим сообщение среди всех тем.Если это уникальный почтовый идентификатор, то все сложнее.

Сначала создайте запрос, который возвращает два столбца.Столбцы - это номер потока для каждого потока, на который подписан пользователь.Второй столбец - количество сообщений в этой теме.

Это довольно простой запрос для разработки.Я предполагаю, что запрос возвращает столбцы с именами 'thread' и 'posts'.

Теперь мы создадим новый запрос на основе того, который содержит непрочитанные сообщения для каждой такой цепочки.Я предполагаю, что нас интересует пользователь номер 5. Вам нужно будет заменить запрос, который вы уже написали, на OtherQuery (но сохраните скобки).

SELECT other.thread, (other.posts - COALESCE(posts_read.has_read_post,0) )
AS UnreadCount FROM (OtherQuery) other LEFT OUTER JOIN
posts_read ON posts_read.of_thread = other.thread AND posts_read.user=5

Теперь вы, вероятно, хотите добавить WHERE UnreadCount > 0 на этот запрос, чтобы получить только темы с непрочитанными сообщениями.Вы также хотите ORDERBY, но у вас не должно возникнуть проблем с добавлением этого.

Редактировать: Пересмотреть запрос, исходя из предположения, что идентификатор поста строго увеличивается:

SELECT other.thread, (SELECT count(*) FROM posts WHERE
    posts.Thread = subscribed_to.thread
    AND posts.ID > COALESCE(posts_read.has_read_post,0)
    AND Post.Deleted=0) AS UnreadCount
FROM subscribed_to LEFT OUTER JOIN
    posts_read ON posts_read.of_thread = subscribed_to.thread AND
    posts_read.user=subscribed_to.user
WHERE subscribed_to.user=5

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

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