SQL возвращает только 1 строку на уникальный идентификатор в таблице - PullRequest
1 голос
/ 17 ноября 2011

Я пробовал все виды различных способов сделать запрос, но просто не могу получить именно то, что хочу ... То, что я использую ниже, работает БОЛЬШОЕ с 1 исключением ... Мне нужно, чтобы запрос возвращал только 1строка на уникальный идентификатор.Внизу приведен пример того, что я хочу получить в конце.

Мой текущий запрос:

SELECT
  T.id,
  T.request_type,
  T.created_timestamp,
  T.status,
  T.subject,
  P.id,
  P.created_timestamp,
  P.created_by_user,
  P.post
FROM request_threads T
INNER JOIN request_posts P
  ON T.id = P.id
WHERE T.created_by_user = 2
  AND P.created_by_user != (
    SELECT MAX(P2.created_timestamp)
    FROM request_posts P2 WHERE id = T.id
    )
ORDER BY P.created_timestamp DESC

Мои текущие результаты запроса: id request_type created_timestamp status subject id created_timestamp created_by_user post 4 7 2011-11-08 10:50:57.440 7 Request 4 blah black 4 2011-11-14 17:44:16.603 3 Changed status to Closed. 4 7 2011-11-08 10:50:57.440 7 Request 4 blah black 4 2011-11-14 17:44:07.060 3 Test for caps and no punct! 4 7 2011-11-08 10:50:57.440 7 Request 4 blah black 4 2011-11-14 17:43:36.797 3 New formated post with a capital first letter and a period at the end. 4 7 2011-11-08 10:50:57.440 7 Request 4 blah black 4 2011-11-14 13:42:27.707 3 Changed status to Pending. Just testing... test again Blah 2 7 2011-11-07 14:53:01.410 7 Request 2 blah green 2 2011-11-08 13:05:23.183 3 Changed status to Closed. 4 7 2011-11-08 10:50:57.440 7 Request 4 blah black 4 2011-11-08 10:50:57.527 2 This is the 1st yellow post for four 2 7 2011-11-07 14:53:01.410 7 Request 2 blah green 2 2011-11-07 14:53:01.420 2 This is the 1st green post for two

Результаты, которые я надеюсь получить:
(обратите внимание, что я хочу получить самую старую созданную отметку времени из таблицы request_posts) id request_type created_timestamp status subject id created_timestamp created_by_user post 4 7 2011-11-08 10:50:57.440 7 Request 4 blah black 4 2011-11-14 17:44:16.603 3 Changed status to Closed. 2 7 2011-11-07 14:53:01.410 7 Request 2 blah green 2 2011-11-08 13:05:23.183 3 Changed status to Closed.

Ответы [ 4 ]

1 голос
/ 17 ноября 2011
select *
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY p.created_timestamp DESC) AS row
        , T.id AS tID, T.request_type, T.created_timestamp AS c_timestamp, T.status, T.subject
        , P.id AS pID, P.created_timestamp AS p_timestamp, P.created_by_user, P.post
    FROM request_threads T 
    JOIN request_posts P
        ON T.id = P.id
    WHERE T.created_by_user = 2
    ) x
WHERE row = 1
1 голос
/ 17 ноября 2011

Вы говорите, что хотите получить самую старую строку из таблицы сообщений, поэтому вы сможете получить желаемый результат, немного изменив предложение WHERE:

SELECT 
    T.id,
    T.request_type,
    T.created_timestamp,
    T.status,
    T.subject,
    P.id,
    P.created_timestamp,
    P.created_by_user,
    P.post
FROM request_threads T
INNER JOIN request_posts P
    ON T.id = P.id
WHERE T.created_by_user = 2
  AND P.created_timestamp = 
        (SELECT MIN(P2.created_timestamp)
         FROM request_posts P2
         WHERE id = T.id)
ORDER BY P.created_timestamp DESC
0 голосов
/ 17 ноября 2011

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

SELECT T.id, T.request_type, T.created_timestamp, T.status, T.subject, P.id, P.created_timestamp, P.created_by_user, P.post
FROM request_threads T 
    INNER JOIN request_posts P
        ON T.id = P.id
        AND P.created_timestamp = (SELECT MIN(S.created_timestamp) FROM request_posts S WHERE P.id = S.id)
WHERE
T.created_by_user = 2
    AND P.created_by_user != (SELECT MAX(P2.created_timestamp) FROM request_posts P2 WHERE id = T.id)
ORDER BY P.created_timestamp DESC

Отредактировано для самой старой = MIN: -)

0 голосов
/ 17 ноября 2011

Я не понимаю эту часть вашего предложения where:

AND P.created_by_user != (SELECT MAX(P2.created_timestamp) FROM request_posts P2 WHERE id = T.id)

Вы сравниваете идентификатор пользователя с датой там. Я думаю, что вы можете заменить это предложение следующим:

AND P.created_timestamp = (SELECT MIN(P2.created_timestamp) FROM request_posts P2 WHERE id = T.id)

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

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