Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
Mysql 选择具有特定条件但使用GROUP BY的表的唯一/不同行_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql 选择具有特定条件但使用GROUP BY的表的唯一/不同行

Mysql 选择具有特定条件但使用GROUP BY的表的唯一/不同行,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,事实上,我真的不知道合适的标题,这将使它作为一个独特的问题。相信我,我尽了最大努力搜索内部连接、联合和独立,只是为了完成我的查询 我只有一张桌子,看起来像这样: ID | ITEM | MESSAGE_INFO | PARENT_ID | IS_CLOSED | IS_APPROVAL 1 | A123 | test 1 | null | 1 | 1 2 | A123 | reply to.. | 1 | null

事实上,我真的不知道合适的标题,这将使它作为一个独特的问题。相信我,我尽了最大努力搜索内部连接、联合和独立,只是为了完成我的查询

我只有一张桌子,看起来像这样:

ID | ITEM | MESSAGE_INFO | PARENT_ID | IS_CLOSED | IS_APPROVAL
1  | A123 |   test 1     |   null    |   1       |     1
2  | A123 | reply to..   |    1      |   null    |    null
3  | A123 |another reply.|    1      |   null    |    null
4  | B456 |   test 2     |    null   |   null    |     1
5  | A123 | new test 1   |    1      |   null    |     1
6  | C789 |  test 3      |   null    |    2      |     1
7  | C789 | reply to 3   |    6      |   null    |    null
注:

来自原始作者的邮件将在IS_批准中有1条 列,并且父\u ID为空。这意味着这是发送的原始消息。如果对话仍然打开,IS_CLOSED将包含1;如果原始作者无法再回复,则包含2;如果为空,则表示收件人尚未打开邮件。 父ID将包含邮件答复的ID。 回复原作者的邮件在IS_CLOSED列中为空 现在我想做的是,我想从原始作者那里得到每一项的最新消息。因此,预期结果如下:

ID | ITEM | MESSAGE_INFO | PARENT_ID | IS_CLOSED | IS_APPROVAL
5  | A123 | new test 1   |    1      |   null    |     1
4  | B456 |   test 2     |    null   |   null    |     1
我尝试了以下查询:

SELECT *
FROM TABLE
WHERE IS_APPROVAL = 1
    AND (
        IS_CLOSED IS NULL
        OR IS_CLOSED < 2
        )
GROUP BY ITEM
ORDER BY ID DESC;

这应该可以做到:

SELECT tab.* FROM tab
INNER JOIN (SELECT MAX(ID) as ID FROM tab WHERE IS_APPROVAL = 1 AND (IS_CLOSED IS NULL OR IS_CLOSED<2) GROUP BY ITEM) ids
ON tab.ID = ids.ID;

它将首先确定每个项目组的最高ID作为最近性的度量,然后在其自身上执行联接。

这是真实的表结构吗

declare @t table(ID int,ITEM varchar(50),MESSAGE_INFO varchar(50)
, PARENT_ID int, IS_CLOSED int,IS_APPROVAL int)
insert into @t VALUES
(1  ,'A123','   test 1     ',null  ,1     , 1   )
,(2  ,'A123',' reply to..   ', 1    ,null  ,null )
,(3  ,'A123','another reply.', 1    ,null  ,null )
,(4  ,'B456','   test 2     ', null ,null  , 1   )
,(5  ,'A123',' new test 1   ', 1    ,null  , 1   )
,(6  ,'C789','  test 3      ',null  , 2    , 1   )
,(7  ,'C789',' reply to 3   ', 6    ,null  ,null )

;With CTE as
(
select *,ROW_NUMBER()over(partition by item order by id desc)rn 
from @t
where IS_APPROVAL = 1 AND (IS_CLOSED IS NULL OR IS_CLOSED<2) 
)
select * from cte where rn=1

SELECT*不能与GROUP BY组合。这是无效的SQL。MySQL在版本5.7.5之前接受它,但它为GROUPBY子句中未出现的列选择的值是不确定的。是不同公司生产的不同的、不相关的软件包。请使用正确的标签。谢谢提醒。我认为SQLServer的字面意思是服务器,它是一个sql查询。顺便说一句,它是在我输入问题时自动添加的,所以我没有想到删除它。单击标签并阅读其说明。或者将鼠标光标放在问题下方标记列表中的标记上,然后等待。在回答您的第一条评论时,我尝试手动选择查询所需的列,认为这可能会影响查询。但是它没有对结果做任何改变。是的。但是我没有创建表结构。我只是想增强整个系统的一部分。
declare @t table(ID int,ITEM varchar(50),MESSAGE_INFO varchar(50)
, PARENT_ID int, IS_CLOSED int,IS_APPROVAL int)
insert into @t VALUES
(1  ,'A123','   test 1     ',null  ,1     , 1   )
,(2  ,'A123',' reply to..   ', 1    ,null  ,null )
,(3  ,'A123','another reply.', 1    ,null  ,null )
,(4  ,'B456','   test 2     ', null ,null  , 1   )
,(5  ,'A123',' new test 1   ', 1    ,null  , 1   )
,(6  ,'C789','  test 3      ',null  , 2    , 1   )
,(7  ,'C789',' reply to 3   ', 6    ,null  ,null )

;With CTE as
(
select *,ROW_NUMBER()over(partition by item order by id desc)rn 
from @t
where IS_APPROVAL = 1 AND (IS_CLOSED IS NULL OR IS_CLOSED<2) 
)
select * from cte where rn=1