SQL, SELECT з двох таблиць без отримання всіх рядків

I have two tables: COMMENT and COMMENTHISTORY

Тепер мені потрібно вибрати SELECT клітинки з обох таблиць, наприклад:

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c, COMMENTHISTORY ch
WHERE ch.CommentId = c.Id
ORDER BY ch.Timestamp DESC

Працює відмінно. Єдина проблема полягає в тому, що COMMENTHISTORY має кілька рядків для кожного COMMENT , тому SELECT закінчується отриманням декількох рядків для кожного коментаря.

Мені потрібно отримати один рядок для кожного коментаря. Рядок, де ch.Text і ch.Timestamp відповідають останнім відповідним рядкам COMMENTHISTORY .

Будь-які ідеї про те, як це зробити?

Дякую.

4
Шкідливі звички: використання старих JOINs - стиль старого стилю розділений комами таблиць припинено за допомогою стандарту ANSI- 92 ( більше 20 років тому!)
додано Автор marc_s, джерело
SQL Server/Oracle/MySQL? Будь ласка, змініть запитання, щоб додати тег БД, який ви використовуєте
додано Автор shahkalpesh, джерело
спробуйте максимізувати ch.Text і ch.Timestamp і групувати іншими двома
додано Автор Milen, джерело
Я думаю, що внутрішня допомога допоможе вам.
додано Автор rptwsthi, джерело
COMMENTHISTORY має стовпець із номером рядка?
додано Автор Justin, джерело

9 Відповіді

Це усуне проблему

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c LEFT JOIN COMMENTHISTORY ch on C.ID = ch.comment_id
WHERE ch.CommentId = c.Id
GROUP BY c.id
ORDER BY ch.Timestamp DESC
1
додано

Try using inner join and put your conditions in Where clause . For more info please have a look of this :- Joins selection diagram

0
додано

Використовуй це:

SELECT c.Id, c.Userid, Max(ch.Text), max(ch.Timestamp)
FROM COMMENT c, COMMENTHISTORY ch
WHERE ch.CommentId = c.Id
GROUP BY C.ID, c.Userid
ORDER BY ch.Timestamp DESC
0
додано
Макс (ch.Text), макс. (ch.Timestamp) не може повернути той самий рядок
додано Автор bendataclear, джерело
Стовпець "COMMENTHISTORY.TimeStamp" недійсний у реченні ORDER BY, оскільки він не міститься ні в агрегатній функції, ні в пропозиції GROUP BY.
додано Автор Drammy, джерело

Цей запит вибере останній запис CommentHisotry для останнього запису для даного імені коментаря:

WITH LastComment AS
(
    SELECT CH.CommentId, MAX(CH.Timestamp) as Date
    FROM COMMENTHISTORY CH
    GROUP BY CH.CommentId
)

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c
INNER JOIN LastComment lc ON LC.CommentId = c.Id
INNER JOIN COMMENTHISTORY ch ON ch.CommentId = lc.CommentId and ch.TimeStamp = lc.Date
ORDER BY ch.Timestamp DESC
0
додано
  SELECT c.Id, c.Userid, max(ch.Timestamp),max(ch.text)
    FROM COMMENT c, COMMENTHISTORY ch
    WHERE ch.CommentId = c.Id
    Group By  c.Id, c.Userid
    ORDER BY ch.Timestamp DESC
0
додано
ще раз Макс (ch.Text), макс (ch.Timestamp) може не повернути той самий рядок
додано Автор bendataclear, джерело

Запит:

SELECT c.Id, 
       c.Userid, 
       ch.Text, 
       ch.Timestamp
FROM COMMENT c
INNER JOIN COMMENTHISTORY ch
  ON ch.CommentId = c.Id
WHERE ch.Timestamp = (SELECT MAX(ch2.Timestamp)
                      FROM COMMENTHISTORY ch2
                      WHERE ch2.CommentId = c.Id )
ORDER BY ch.Timestamp DESC
0
додано
Ідеальний. Він працює так само, як слід.
додано Автор user2500179, джерело
SELECT c.Id, c.Userid, ch.Text, max(ch.Timestamp)
FROM COMMENT c, COMMENTHISTORY ch
WHERE ch.CommentId = c.Id
GROUP BY C.ID, c.userid, ch.text
0
додано
Чи є необхідність ORDER BY , оскільки ви берете MAX часової мітки?
додано Автор sarwar026, джерело
Чи буде це працювати з GROUP BY , що не містить усіх необхідних стовпців, крім агрегованого?
додано Автор shahkalpesh, джерело
Ви повинні згрупувати інші два поля ...
додано Автор Milen, джерело

Це має зробити це ...

;WITH CTE AS
(
    SELECT  ch.CommentId, ch.Text, ch.TimeStamp, ROW_NUMBER() OVER (PARTITION BY     ch.CommentId ORDER BY ch.TimeStamp DESC) RowNum
    FROM    COMMENTHISTORY ch
)
SELECT          c.Id, c.Userid, CTE.Text, CTE.TimeStamp
FROM            COMMENT c
    INNER JOIN  CTE ON c.Id = CTE.CommentId
WHERE           RowNum = 1
0
додано

Це може допомогти вам:

SELECT c.Id, c.Userid, ch.Text, ch.Timestamp
FROM COMMENT c LEFT JOIN COMMENTHISTORY ch ON ch.CommentId = c.Id
ORDER BY ch.Timestamp DESC
0
додано
Не працює. Цей запит дає точно ті ж результати, що й мій власний запит (тобто всі рядки COMMENTHISTORY, а не тільки найновіші)
додано Автор user2500179, джерело