如何从mysql中的表中跳过行
Posted
技术标签:
【中文标题】如何从mysql中的表中跳过行【英文标题】:How to skip rows from table in mysql 【发布时间】:2020-11-26 10:40:11 【问题描述】:我有一个包含以下数据的表,我想跳过第 3 行,只想获取 OPEN 状态一次,我正在使用下面的查询,但它也跳过了第 5 行。
SELECT t.*
FROM emailEvent t
JOIN
( SELECT MIN(id) AS minid
FROM emailEvent WHERE email_id = 3
GROUP BY status
) AS grp
ON grp.minid = t.id
WHERE (t.email_id = 3)
我想出了这个作为解决方案,但不确定是否还有其他最佳解决方案
SELECT t.*
FROM emailEvent t
WHERE t.status != "Open" and t.email_id = 3
UNION
(
SELECT et.*
FROM emailEvent et
WHERE et.status = "Open" and et.email_id = 3
ORDER BY et.createdAt DESC LIMIT 1
)
我希望结果看起来像这样
【问题讨论】:
orgid 从何而来。它不在您的示例表中。 包括除 id t.id != 3 之外的所有内容? @TomC 打错了 你的 mysql 版本支持 ROW_NUMBER 吗? 是的,它确实支持 【参考方案1】:SELECT *
FROM
(
SELECT t.*,
min(id) over (partition by status) as min_id
FROM emailEvent t
WHERE (t.email_id = 3) -- only email 3
) AS dt
WHERE id = min_id -- only for 'Open' status
OR status <> 'Open'
对于不支持 Windowed Aggregates 的旧版本:
select *
from emailEvent
where email_id = 3
and
(
e.status <> 'Open'
or id in (select min(id) -- only for 'Open' status
from emailEvent
where status = 'Open'
and email_id = 3)
)
【讨论】:
这里的partition by status
是什么意思?
类似于 GROUP BY 的聚合,计算每个状态的 min(id)【参考方案2】:
与NOT EXISTS
:
select e.* from emailEvent e
where e.status <> 'Open'
or not exists (select 1 from emailEvent where status = e.status and id < e.id)
【讨论】:
以上是关于如何从mysql中的表中跳过行的主要内容,如果未能解决你的问题,请参考以下文章
在过去 24 小时内从 MySQL 中选择行并根据间隔 X 跳过行?