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