Объединение двух таблиц и выбор только лучших 'n' записей - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь написать приложение для социальной сети, но я застрял в части постов / комментариев на стене. У меня есть две таблицы, POSTS и КОММЕНТАРИИ ;

CREATE TABLE [dbo].[COMMENTS](
    [COMMENT_ID] [int] IDENTITY(1,1) NOT NULL,
    [POST_ID] [int] NOT NULL,
    [USER_ID] [smallint] NOT NULL,
    [COMMENT] [nvarchar](max) NOT NULL,
    [CREATED] [datetime]
)
-- COMMENT_ID is PK

CREATE TABLE [dbo].[POSTS](
    [POST_ID] [int] IDENTITY(1,1) NOT NULL,
    [USER_ID] [int] NOT NULL,
    [POST] [nvarchar](max) NOT NULL,
    [CREATED] [datetime]
)
-- POST_ID is PK

Я пытаюсь выбрать TOP N записей из таблицы POSTS и все комментарии принадлежат этим записям. Я использую следующий запрос, но он выбирает все записи из POSTS и COMMENTS, что замедляет работу сервера, так как есть очень много POSTS

SELECT POST_ID, NULL AS COMMENT_ID, USER_ID, POST, CREATED, POST_ID AS SEQUENCE FROM POSTS
UNION
SELECT POST_ID, COMMENT_ID, USER_ID, COMMENT AS POST, CREATED, POST_ID AS SEQUENCE FROM COMMENTS
ORDER BY SEQUENCE DESC

Как выбрать ТОП 10 постов и все комментарии к этим сообщениям? Я также хотел бы добавить эти записи на страницу, так что, возможно, код подкачки был бы для меня идеальным. Я имею в виду, вместо того, чтобы выбирать топ-10 сообщений, я хотел бы выбрать 10 постов со страницы 2 и их комментарии.

Я не уверен, возможно ли это с этой структурой таблицы. Если это не так, возможно, вы должны предложить мне лучшую структуру стола.

Спасибо.

РЕДАКТИРОВАТЬ: Я хочу, чтобы набор записей был, как показано ниже. Я думаю, что приведенная ниже таблица лучше, чем INNER JOIN-ed. Все, что я хочу, это ВЫБЕРИТЕ ТОП N постов , ничего более.

POST_ID     | COMMENT_ID    | USER_ID   | POST                          | CREATED
----------------------------------------------------------------------------------------
3               NULL            2           This post has no comments       2011-02-12
1               NULL            1           A new post                      2011-02-11
1               1               2           Comment for post 1              2011-02-11
1               2               1           Another comment for post 1      2011-02-11
1               5               2           Another comment for post 1      2011-02-11
2               NULL            2           Another post                    2011-02-07
2               3               1           Comment for post 2              2011-02-07
2               4               2           Another comment for post 2      2011-02-07

Ответы [ 5 ]

4 голосов
/ 15 февраля 2011
select post_id, comment_id, user_id, post, created
from (
    select top 10 post_id, null as comment_id, user_id, post, created
    from posts
    order by created desc
    ) ss

union

select 
    posts.post_id
    , comment_id
    , comments.user_id
    , comment as post
    , comments.created
from posts
inner join comments on posts.post_id = comments.post_id
where posts.post_id in (
    select top 10 post_id
    from posts
    order by created desc
    )

order by created desc
0 голосов
/ 23 марта 2015

Соедините две таблицы и получите 10 лучших записей

выберите лучшие 10 * из внутреннего соединения Table1 Table2 на Table1.empid = Table2.empid

0 голосов
/ 15 февраля 2011

Попробуй это.

SELECT POST_ID, NULL AS COMMENT_ID, USER_ID, POST, CREATED, POST_ID AS SEQUENCE FROM POSTS
UNION
SELECT POST_ID, COMMENT_ID, USER_ID, COMMENT AS POST, CREATED, POST_ID AS SEQUENCE FROM COMMENTS
ORDER BY SEQUENCE DESC
WHERE (POSTS.POST_ID IN (SELECT TOP (10) POST_ID FROM POSTS as POSTS1))

Также я не понимаю, почему вы используете Union over Inner Join. Вы можете попробовать это тоже.

0 голосов
/ 15 февраля 2011

Что касается нумерации страниц, я думаю, вам нужно будет использовать ROW_NUMBER() - документы - чтобы создать счет на основе вашего POST_ID.Таким образом, вы можете выбирать диапазоны динамически во время запроса.

Надеюсь, это поможет.

0 голосов
/ 15 февраля 2011

UNIONUNION ALL) дает вам объединенный результат двух совершенно отдельных SELECT запросов, что, вероятно, не совсем то, что вы хотите с последним фрагментом кода.

Как выбрать ТОП 10 постов и все комментарии к этим сообщениям?

Я бы предположил, что простой INNER JOIN от POSTS до COMMENTS должен быть хорошим началом. Не уверен, как лучше реализовать пейджинг в таком сценарии.

...