Mysql 检查相邻列中相同条目的行(第2部分)
我需要一个select命令来执行以下操作: 我有一张这样的桌子Mysql 检查相邻列中相同条目的行(第2部分),mysql,sql,select,Mysql,Sql,Select,我需要一个select命令来执行以下操作: 我有一张这样的桌子 TIMESTAMP | ID | col1 | col2 | ... t | 23 | AAA | BBB | ... t | 23 | BBB | AAA | ... t | 59 | asf | 567 | ... t | 02 | XXX | ZZZ | ... t | 02 | YYY |
TIMESTAMP | ID | col1 | col2 | ...
t | 23 | AAA | BBB | ...
t | 23 | BBB | AAA | ...
t | 59 | asf | 567 | ...
t | 02 | XXX | ZZZ | ...
t | 02 | YYY | XXX | ...
t-1 | 23 | AAA | BBB | ...
t-1 | 23 | BBB | AAA | ...
t-1 | 59 | asf | 567 | ...
t-1 | 02 | XXX | ZZZ | ...
t-1 | 02 | YYY | XXX | ...
t-2 | .. | ... | ... | ...
t-2 | .. | ... | ... | ...
对于每一次,有时有两行具有相同的ID。现在我只想选择时间戳为t的最近的一行,它们在两个特定列中也有相同的直径相邻条目,如示例中的前两行。通过类比,这些具有相同ID但不同条目的条目可以看到最后两行
因此,对于该示例,我希望有两个选择:
TIMESTAMP | ID | col1 | col2 | ...
t | 23 | AAA | BBB | ...
t | 23 | BBB | AAA | ...
及
我知道它应该和这个一起工作
SELECT a.id, a.col1, a.col2
FROM tbl AS a
JOIN tbl AS b ON
( a.id=b.id
AND (a.col1 = b.col2 OR a.col2 = b.col1)
AND (a.col1 != b.col1 AND a.col2 != b.col2)
)
但是我不知道如何只选择最新的条目…到目前为止,您的查询需要一个独特的条目以及最新的时间戳谓词:
select distinct ta.*
from tbl ta
JOIN tbl AS tb ON
( ta.id=tb.id
AND (ta.col1 = tb.col2 OR ta.col2 = tb.col1)
AND (ta.col1 != tb.col1 AND ta.col2 != tb.col2)
)
inner join (
SELECT a.id,max(a.`timestamp`) as maxTimestamp
FROM tbl AS a
JOIN tbl AS b ON
( a.id=b.id
AND (a.col1 = b.col2 OR a.col2 = b.col1)
AND (a.col1 != b.col1 AND a.col2 != b.col2)
)
GROUP by a.id
) b on b.id = ta.id and b.maxTimestamp = ta.`timestamp`;
你说最新的是什么意思?今天的条目,最后3个小时,或者….?这个具有最大时间戳的条目,我认为应该是这样的:timestamp=从TBL中选择MAXTIMESTAMP似乎正确,它是否有效?我不确定,因为我不知道如何正确组合这两个语句…不幸的是,这不起作用,为什么要将时间戳放在“…”中?背后有什么意义吗?
select distinct ta.*
from tbl ta
JOIN tbl AS tb ON
( ta.id=tb.id
AND (ta.col1 = tb.col2 OR ta.col2 = tb.col1)
AND (ta.col1 != tb.col1 AND ta.col2 != tb.col2)
)
inner join (
SELECT a.id,max(a.`timestamp`) as maxTimestamp
FROM tbl AS a
JOIN tbl AS b ON
( a.id=b.id
AND (a.col1 = b.col2 OR a.col2 = b.col1)
AND (a.col1 != b.col1 AND a.col2 != b.col2)
)
GROUP by a.id
) b on b.id = ta.id and b.maxTimestamp = ta.`timestamp`;