Mysql 针对特定条件合并表中的两行

Mysql 针对特定条件合并表中的两行,mysql,sql,Mysql,Sql,我在mysql中有一个表,它有以下列 order --------------------- id integer order_id integer status integer time-stamp timestamp 我需要找出表中两行的时间戳之间的差异,其中两行的order_id相同,一行的状态为2,另一行的状态为4 我试图通过不同的sql函数进行连接,但尚未成功。进行自连接,例如: select t1.*, t2.*, t2.timestamp - t1.timestamp fro

我在mysql中有一个表,它有以下列

order
---------------------
id integer 
order_id integer 
status integer
time-stamp timestamp
我需要找出表中两行的时间戳之间的差异,其中两行的order_id相同,一行的状态为2,另一行的状态为4


我试图通过不同的sql函数进行连接,但尚未成功。

进行自连接,例如:

select t1.*, t2.*, t2.timestamp - t1.timestamp
from tablename t1
  join tablename t2 ON t1.order_id = t2.order_id
where t1.status = 2
  and t2.status = 4

我对MySQL不是很了解,所以
t2.timestamp-t1.timestamp
部分可能需要调整。

一种方法是使用自连接(即,将表本身连接起来),并使用

SELECT TIMESTAMPDIFF(SECOND, a.`time-stamp`, b.`time-stamp`)
FROM `order` a 
JOIN `order` b ON a.order_id = b.order_id
WHERE a.status = 2 
  AND b.status = 4
这假设订单id和状态的每个组合只有一个匹配行。如果可以有多个行,则需要选择要进行比较的特定行。

我使用了此查询

SELECT ,SUBSTRING_INDEX(group_concat(timestamp separator ','),',',1)  
as time1, SUBSTRING_INDEX(group_concat(timestamp separator ,'),',',-1)
as time2, group_concat(status separator ',') as stat,COUNT() as cont 
FROM order_log ol WHERE (ol.status = 2 OR ol.status = 4) GROUP BY 
ol.order_id HAVING COUNT(*) = 2 AND stat='2,4'

工作起来很有魅力。

那么你有机会尝试一下答案,看看它们是否有效吗?选择,子字符串索引(group_concat(时间戳分隔符’,’,’,’,1)作为时间1,子字符串索引(group_concat(时间戳分隔符’,’,’,’,-1)作为时间2,group_concat(状态分隔符’,’)作为stat,COUNT()作为order_log ol中的cont(ol.status=2或ol.status=4)GROUP BY ol.order_id具有COUNT(*)=2和stat='2,4'我使用了此查询,它就像一个符咒。与其将您的解决方案发布为注释,不如将其发布为答案,然后您可以将其标记为已接受,因为问题将被标记为已解决(这对社区很有帮助).只是出于好奇问,但这怎么能告诉你不同行之间的区别呢?