MYSQL查询,它可以从可能具有相同值但发生翻转的两行中按最高日期时间进行分组

MYSQL查询,它可以从可能具有相同值但发生翻转的两行中按最高日期时间进行分组,mysql,sql,Mysql,Sql,我有一个MYSQL 5.x数据库,无法更改模式,只读访问: SELECT * FROM table; --------------------+------------+------------+--------- stamp | src | dst | data --------------------+------------+------------+--------- 2017-12-06 11:08:39 | 205

我有一个MYSQL 5.x数据库,无法更改模式,只读访问:

SELECT * FROM table;

--------------------+------------+------------+---------
stamp               | src        | dst        | data      
--------------------+------------+------------+---------
2017-12-06 11:08:39 | 2055551234 | 2059999999 | somedata
2017-12-04 16:04:14 | 2059999999 | 2055551234 | somedata
2017-12-04 14:28:21 | 2055551234 | 2059999999 | somedata
2017-12-04 14:26:24 | 8004441111 | 2562428766 | somedata
2017-12-04 14:06:22 | 2562428766 | 8004441111 | somedata
2017-12-04 13:15:52 | 8004441111 | 2562428766 | somedata
+---------------------+------------+------------+-------
我需要为两个数字的集合提供服务的所有行,例如205551234和205551234,每个都可以是SRC或DST。我需要最近的一排

我需要同时包含205551234和205551234但在SRC或DST列中的行。值可以在任一列中,因此我的问题是

每个匹配的SRC、DST集都有多行,我需要包含每个集的最新日期时间的行

当我决定尝试用MD5(SRC+DST)创建一个同样等于MD5(DST+SRC)的散列时,我认为我已经智胜,但我得到了不可靠的结果

可以有1到数千组具有匹配集的行

我需要能够限制结果,这样,由于每个组中都有未知的行,仅迭代客户端将无法工作

我不能存储任何过程,任何迭代工作都必须在客户端完成

根据上述数据,我想:

--------------------+------------+------------+---------
stamp               | src        | dst        | data      
--------------------+------------+------------+---------
2017-12-06 11:08:39 | 2055551234 | 2059999999 | somedata
2017-12-04 14:26:24 | 8004441111 | 2562428766 | somedata
+---------------------+------------+------------+-------

想法?

啊,现在我想我明白了。你不是在寻找两个特定的数字;您正在查找具有相同数字对的行组,无论其顺序如何。因此,获得较小和较大的值和组

select *
from mytable
where (least(src, dst), greatest(src, dst), stamp) in
(
  select least(src, dst), greatest(src, dst), max(stamp)
  from mytable
  group by least(src, dst), greatest(src, dst)
);
SQL fiddle:


这行吗?

好的,我知道你想要什么了……你得到了什么,并显示你的查询。请解释你的结果是如何得到的。例如,
2017-12-06 11:08:22
从哪里来?是的,如果您正在查找包含
205551234
2059999999
的行,那么如何选择第二个结果行?您想要包含两个值的行,但在任一列中,对吗?@miknik!这看起来很有希望!我在晚饭后比较数据,然后再发回来。寄予厚望!这肯定比我更接近,但如果有src和dst的值,它会在结果中将它们视为单独的行。我需要将每一组src、dst(无论它们的顺序如何)视为一个,并且仅是结果中返回的集的最新日期时间。我不认为这在我的查询中是可能的。你试的时候一定弄错了。我的查询不单独查看
src
dst
,它总是查看
最小(src,dst)
最大(src,dst)
。因此,无论一条记录包含123/456还是456/123,我的查询都将两者视为123/456,因为
least
为123,而
magest
为456。下面是一个SQL小提琴来证明这一点。
SELECT *
FROM mytbl AS t1
WHERE stamp IN (
    SELECT MAX(stamp) AS maxStamp
    FROM (
        SELECT *, CONCAT(GREATEST(src, dst), '.', LEAST(src, dst)) AS gbval 
        FROM `mytbl` AS t2
    ) AS t3
    GROUP BY t3.gbval
    HAVING maxStamp = t1.stamp
)