Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL,从两个表中选择,而不获取所有行_Sql_Select - Fatal编程技术网

SQL,从两个表中选择,而不获取所有行

SQL,从两个表中选择,而不获取所有行,sql,select,Sql,Select,我有两个表:COMMENT和COMMENTHISTORY 现在我需要从两个表中选择单元格,如下所示: 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中的每个注释都有几行,因此SELECT最终会为每个注释检索几行 我需要的是为每个注释检

我有两个表:
COMMENT
COMMENTHISTORY

现在我需要从两个表中选择单元格,如下所示:

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
中的每个
注释都有几行,因此
SELECT
最终会为每个注释检索几行

我需要的是为每个注释检索一行。ch.Text和ch.Timestamp与最新相关的
COMMENTHISTORY
行匹配的行

有什么办法吗

谢谢。

这可能会帮助您:

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
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
使用以下命令:

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

这将解决您的问题

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

此查询将为给定注释id的最新记录选择last
CommentHisotry
record:

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

尝试使用内部联接,并将条件放入Where子句中。有关更多信息,请查看以下内容:-

查询:

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
这应该可以

;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

我认为内部连接会对您有所帮助。试着用另外两个SQL Server/Oracle/MySQL最大化ch.Text和ch.Timestamp并分组?请修改问题以添加您正在使用的数据库的标记
COMMENTHISTORY
has row ID column?-ANSI-92 SQL标准(20多年前!)停止了旧式的逗号分隔的表格列表样式。
GROUP BY
除了聚合的列之外,不包含所有必需的列吗?既然您使用的是时间戳的
MAX
,是否需要
ORDER BY
(ch.Text),max(ch.Timestamp)
可能不会返回同一行,因为ORDER BY子句中的“COMMENTHISTORY.Timestamp”列无效,因为它不包含在聚合函数或GROUP BY子句中。同样
max(ch.Text),max(ch.Timestamp)
可能不会返回同一行。此查询提供的结果与我自己的查询完全相同(即所有COMMENTHISTORY行,而不仅仅是最新的一行)
;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