2011-12-21 2 views
1

Это несколько время меня озадачило.Показаны «Подписчики» Сообщения и личные сообщения пользователя

Моя проблема: У меня есть две разные таблицы. Таблица для сообщений пользователей и таблица для подписчиков.

В таблице абонентов выглядит следующим образом:

SubscriberID -> ProfileID
1 -> 2
1 -> 3
2 -> 3
2 -> 4
3 -> 2

Мои сообщения таблица выглядит следующим образом:

сообщения дан -> AuthorID -> постдатировать -> PostBody
1 -> 2 -> 12/20/12 -> Hello Word
2 -> 3 -> 12/21/12 -> Bye Bye World
3 -> 1 -> 12/22/12 -> Oh Wait
4 -> 4 -> 12/23/12 -> Кто-нибудь еще здесь?

В принципе, как это работает, пользователь с идентификатором подписывается на пользователя с идентификатором 2 и 3. ID # 2 подписывается на ID # 3 и # 4. Если пользователь подписался на определенного пользователя, они могут видеть только сообщения от человека, на которого они подписались. Теперь я использую следующий я увидел в аналогичный вопрос:

SELECT POSTS.* 
FROM POSTS 
JOIN SUBSCRIBERS 
ON POSTS.AUTHORID = SUBSCRIBERS.PROFILEID 
WHERE SUBSCRIBERS.SUBSCRIBERID = ? 
ORDER BY POSTS.POSTID DESC LIMIT 10 

Это прекрасно работает, но он не показывает запись пользователя, а также. Я пробовал модифицировать его, но он не работает: \

Если вам интересно, "?" представляет собой идентификатор пользователя

Так что, если вы можете, это было бы здорово, если бы кто-то может сказать мне, как включить собственные сообщения пользователя рядом с стойками от людей, пользователь подписывается на

+0

Самый простой способ - позволить пользователям подписаться на себя (что имеет смысл с учетом вашей модели показа подписных сообщений). – djlumley

+0

Выполнение этого, вероятно, будет моим последним приложением, если ничего не работает – InVert

+0

Альтернатива, которую я вижу, - это использовать подзапросы или несколько запросов. Найдите свой список profileID, на который пользователь подписался, затем вытащите список сообщений, в которых идентификатор профиля находится в списке результатов, или текущий идентификатор профиля. – djlumley

ответ

2

Вы можете сделать это модифицируя запрос к:

SELECT POSTS.* 
FROM POSTS 
LEFT JOIN SUBSCRIBERS 
ON POSTS.AUTHORID = SUBSCRIBERS.PROFILEID 
WHERE SUBSCRIBERS.SUBSCRIBERID = ? OR POSTS.AUTHORID = ? 
GROUP BY POSTS.POSTID ORDER BY POSTS.POSTID DESC LIMIT 10 

Он также выбирает собственные сообщения пользователя. Надеюсь, это поможет.

Обновлено: добавлено GROUP BY POSTS.POSTID, поэтому дубликаты удаляются, так как вы ищете только данные в таблице POSTS.

Когда вы запускаете запрос, например, передаете значения - например. для пользователя, имеющего идентификатор 1 запрос выглядит следующим образом:

SELECT POSTS.* 
FROM POSTS 
LEFT JOIN SUBSCRIBERS 
ON POSTS.AUTHORID = SUBSCRIBERS.PROFILEID 
WHERE SUBSCRIBERS.SUBSCRIBERID = 1 OR POSTS.AUTHORID = 1 GROUP BY POSTS.POSTID 
ORDER BY POSTS.POSTID DESC LIMIT 10 

Результаты:

PostID AuthorID PostDate PostBody 

3  1 2012-12-21 Oh Wait 
2  3 2012-12-21 Bye Bye World 
1  2 2012-12-20 Hello Word 

Это то, что вы получаете, когда значения пропуском в запросе выборки правильно. Значения, прошедшие до SUBSCRIBERID и AUTHORID, должны быть одинаковыми. LEFT JOIN исправит вашу проблему.

+0

Странно, это тоже не работает: \ – InVert

+0

Я не эксперт SQL, но я бы сказал, что это может быть потому, что вы присоединяетесь к AuthorID с идентификатором профиля, поэтому без тестирования я предполагаю, что это означает, что хотя бы один человек должен быть подписан пользователю, чтобы их идентификатор AuthorID/ProfileID был указан в объединенной таблице. – djlumley

+0

@ user984935 - Запрос работает правильно, и я проверил его с данными, которые вы разместили в вопросе. Вы должны передать один и тот же идентификатор в 'SUBSCRIBERID' и' AUTHORID', как в моем обновленном запросе в последней части ответа. –

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