Mysql 如何在不重复的情况下按顺序连接行

Mysql 如何在不重复的情况下按顺序连接行,mysql,Mysql,我有一个历史记录表,每当调制解调器被激活或禁用时,它都会进行存储。 我想将两行合并在一起:activation和deactivation 我试着用左键连接。但我让每一行动作都和每一行动作连接起来 Activation id_history id_modem date Type ============================================ 1 2 2017-07-14 Activation 3

我有一个历史记录表,每当调制解调器被激活或禁用时,它都会进行存储。 我想将两行合并在一起:activation和deactivation

我试着用左键连接。但我让每一行动作都和每一行动作连接起来

Activation
id_history  id_modem  date        Type
============================================
1           2         2017-07-14  Activation
3           2         2018-01-18  Activation


Deactivation
id_history  id_modem   date       Type
==============================================
2           2          2017-09-07 Deactivation
4           2          2018-02-19 Deactivation
我想得到这个:

id_history_act  id_modem  date_act    type_act  id_history_dea  date_dea    type_dea
======================================================================================
1               2         2017-07-14  Act       2               2017-09-07  Dea
3               2         2018-01-18  Act       4               2018-02-19  Dea
但当我做出以下决定时,我得到了:

select 
    ha.id_history id_history_act,
    ha.id_modem,
    ha.date date_act,
    ha.type type_act,

    hd.id_history id_history_dea,
    hd.date date_dea,
    hd.type type_dea
from 
    history_activation ha 
    left join history_deactivation hd on(hd.id_modem = ha.id_modem);


id_history_act  id_modem  date_act    type_act  id_history_dea  date_dea    tupe_dea
==================================================================================
1               2         2017-07-14  Act       2               2017-09-07  Dea
1               2         2017-07-14  Act       4               2018-02-19  Dea
3               2         2018-01-18  Act       2               2017-09-07  Dea
3               2         2018-01-18  Act       4               2018-02-19  Dea
我尝试使用秩,但我需要使用变量,并且变量不能在视图中使用

在激活和停用查询中使用count(*)与另一个连接速度太慢

编辑:这是原始表

HistoryTable
id_history  id_modem   date         Type 
====================================================
1           2          2017-07-14   Activation
2           2          2017-09-07   Deactivation
3           2          2018-01-18   Activation
4           2          2018-02-19   Deactivation

您只需要在查询中使用ORDERBY子句

试试这个:

select 
ha.id_history id_history_act,
ha.id_modem,
ha.date date_act,

hd.id_history id_history_des,
hd.date date_des,
from 
history_activation ha 
left join history_desctivation hd on(hd.id_modem = ha.id_modem);
order by date_act

如果id和日期与示例数据一致,则需要自联接,然后为每个
类型=激活
选择
类型=停用
的最小
id\u历史
日期

select
  h1.id_history id_history_act, 
  h1.id_modem, 
  h1.date date_act,
  min(h2.id_history) id_history_des,
  min(h2.date) date_des
from HistoryTable h1 left join HistoryTable h2
on h2.id_modem = h1.id_modem and h2.date > h1.date
where h1.type = 'Activation' and h2.type = 'Deactivation'
group by h1.id_history, h1.id_modem, h1.date
请参阅。
结果:


将同义词date_act和date_des更改为“date”后追加“ORDER BY date”。另外:它在英语中是“deactivate”。)除非您有一个表或以其他方式关联这些表,否则这不会起作用。例如,同时创建激活和禁用记录,将激活ID提供给禁用表,在禁用发生之前保持时间为空。您将如何知道,哪个激活与哪个禁用相关?这是一个数据问题。你不会得到你想要的结果,因为它们都有相同的id_调制解调器,这是你映射开始和结束日期的方式。你如何知道,哪个记录属于哪个事件?您的问题是DD。您需要有
id\u history
activation\u id
列来将您的数据关联为选项之一。如果您使用的是一个表,请再添加一个类似deactivated的列,并将其设置为null。当调制解调器被激活时,添加记录,当被停用时,更新停用列。我认为您不理解这里的问题,除非这是我,否则问题是我得到的是4行而不是2行。我想把id 1和id 2结合起来,id 3和id 4结合起来。@YerryGarcía为什么要把id 1和id 2结合起来?你怎么知道哪一个是激活的,哪一个是停用的?因为id 1是调制解调器激活的时间,id 2是调制解调器上次激活后停用的时间。我想,这是同一个表,到目前为止没有办法区分,问题中有两个表。请看注释!你真是个天才!非常感谢你@耶里加西亚这里没有什么天才。您的原始帖子没有
历史记录表。请键入
,如果没有指示哪个记录是哪个记录,则无法解决此问题。
| id_history_act | id_modem | date_act            | id_history_des | date_des            |
| -------------- | -------- | ------------------- | -------------- | ------------------- |
| 1              | 2        | 2017-07-14 00:00:00 | 2              | 2017-09-07 00:00:00 |
| 3              | 2        | 2018-01-18 12:03:14 | 4              | 2018-02-19 12:15:07 |