如何从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 跳过行?

在CSV文件中跳过标题

在数组中跳过mysql数据库中的值[重复]

如何在 Fortran 90 中跳过带有“#”符号的行? [复制]

Pandas-如何添加条目跳过行的列?

如果不与其他表共享 ID,如何从 SQL 中跳过值