MySQL查询在两行中获取相同的列数据

Posted

技术标签:

【中文标题】MySQL查询在两行中获取相同的列数据【英文标题】:MySQL query to get same column data in two rows 【发布时间】:2020-01-27 11:07:57 【问题描述】:

我是 mysql 新手。我有一个数据库,但在获取以下格式的数据时遇到了问题。

表格如下

+----+------+-------+-+
| ID | ign  | time  | |
+----+------+-------+-+
|  1 | NULL | 12:30 | |
|  2 |    1 | 12:31 | |
|  3 | NULL | 12:32 | |
|  4 | NULL | 12:33 | |
|  5 | NULL | 12:34 | |
|  6 |    0 | 12:35 | |
|  7 | NULL | 12:36 | |
|  8 | NULL | 12:37 | |
|  9 |    1 | 12:38 | |
| 10 | NULL | 12:39 | |
| 11 | NULL | 12:40 | |
| 12 | NULL | 12:41 | |
| 13 |    0 | 12:42 | |
| 14 | NULL | 12:43 | |
| 15 | NULL | 12:44 | |
+----+------+-------+-+

我的结果表应采用以下格式。

Start | Start Time | Stop |Stop Time
1     | 12:31      | 0    | 12:35
1     | 12:38      | 0    | 12:42

结果是由交替的 1 和 0 放在一起获得的。第一个值为 1 的 ign 是起点,第二个值为 0 的 ign 是终点。 1 和 0 各自的时间值是开始和停止时间。我对 MySQL 完全陌生,不知道如何实现。

【问题讨论】:

为什么id到处都是重复的? 而且您似乎没有 PRIMARY KEY,这可能会在不久后造成严重问题 重复的 ID 是拼写错误。结果是通过交替的 1 和 0 放在一起获得的。第一个值为 1 的 ign 是起点,第二个值为 0 的 ign 是终点。 1和0各自的时间值就是起止时间。 【参考方案1】:

您可以使用相关子查询来做到这一点:

select t.ign `Start`, t.time `Start Time`, 0 `Stop`,
  (select min(time) from tablename where ign = 0 and time > t.time) `Stop Time`
from tablename t 
where t.ign = 1

对于ign = 1 的每一行,子查询返回ign = 0 的最小后续时间。 请参阅demo。 结果:

| Start | Start Time | Stop | Stop Time |
| ----- | ---------- | ---- | --------- |
| 1     | 12:31      | 0    | 12:35     |
| 1     | 12:38      | 0    | 12:42     |

【讨论】:

【参考方案2】:

这是一种孤岛问题。您可以进行窗口求和来定义组:忽略 igns 即 nulls,每次遇到 1 时都会启动一个新组。

对于您的数据集,以下查询将产生预期结果:

select 1 start, min(time) startTime, 0 stop, max(time) stopTime
from (
    select t.*, sum(ign) over(order by time) grp
    from mytable t
    where ign is not null
) t
group by grp

请注意,在 MySQL 8.0 中添加了窗口函数。

Demo on DB Fiddle

开始 |开始时间 |停止 |停止时间 ----: | :-------- | ---: | :-------- 1 | 12:31 | 0 | 12:35 1 | 12:38 | 0 | 12:42

【讨论】:

以上是关于MySQL查询在两行中获取相同的列数据的主要内容,如果未能解决你的问题,请参考以下文章

用PHP+mysql查询两个表,然后怎么样把已经查出来的两个数组合并在一起,两张表里有一个相同的字段

如何在 MySQL 数据库的多行中保存表单数据(表单内的表)

MYSQL查一个字段中 多个值

MySQL 从表中获取数据并检查表行中是不是存在用户 ID

如何使用两个不同的列 mySQL 从查询而不是其他查询中获取数据? [复制]

MySQL 表的增删查改