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