MySQL-如何比较一个查询结果的顺序是否和另一个相同?

MySQL-如何比较一个查询结果的顺序是否和另一个相同?,mysql,sql,database,Mysql,Sql,Database,假设我有一个名为Log的数据库表,它看起来是这样的: +----+---------+---------+ | id | item_id | message | +----+---------+---------+ | 1 | 1 | A | +----+---------+---------+ | 2 | 1 | B | +----+---------+---------+ | 3 | 1 | C | +----+-

假设我有一个名为Log的数据库表,它看起来是这样的:

+----+---------+---------+
| id | item_id | message |
+----+---------+---------+
| 1  |    1    |    A    |
+----+---------+---------+
| 2  |    1    |    B    |
+----+---------+---------+
| 3  |    1    |    C    |
+----+---------+---------+
| 4  |    2    |    A    |
+----+---------+---------+
| 5  |    2    |    C    |
+----+---------+---------+
| 6  |    2    |    B    |
+----+---------+---------+
| 7  |    3    |    B    |
+----+---------+---------+
| 8  |    3    |    A    |
+----+---------+---------+
| 9  |    3    |    C    |
+----+---------+---------+
如果我质疑

select * from log where item_id = 1 order by id;
我将收到第1、2和3行。如果我询问的话也是一样的

select * from log where item_id = 1 order by message;
但如果我对第2项做同样的处理,订单会有所不同。按id排序,行的顺序将是4、5和6,但按消息排序将是4、6和5

因此,我的问题是,是否可以进行查询,以了解比较这两个查询时,哪个
项目ID
具有不同的顺序


在本例中,结果是第2项和第3项。

您可以使用变量来解决这一缺口和孤岛问题

以下查询:

SELECT id, item_id, message, id - seq
FROM (
  SELECT id, item_id, message,
         @seq := IF(@i = item_id, @seq + 1, 
                    IF(@i := item_id, 1, 1)) AS seq       
  FROM log
  CROSS JOIN (SELECT @i := 0, @seq := 0) AS v
  ORDER BY item_id, message) AS t
ORDER BY id;
生成此输出:

id, item_id, message, id - seq
--------------------------------
1,  1,       A,       0
2,  1,       B,       0
3,  1,       C,       0
4,  2,       A,       3
5,  2,       C,       2
6,  2,       B,       4
7,  3,       B,       5
8,  3,       A,       7
9,  3,       C,       6
因此可以使用
id seq
来检测
id
消息之间的订单不匹配:

SELECT item_id
FROM (
  SELECT id, item_id, message,
         @seq := IF(@i = item_id, @seq + 1, 
                    IF(@i := item_id, 1, 1)) AS seq       
  FROM log
  CROSS JOIN (SELECT @i := 0, @seq := 0) AS v
  ORDER BY item_id, message) AS t
GROUP BY item_id
HAVING COUNT(DISTINCT id-seq) > 1  
ORDER BY id;

如果我理解正确,您可以使用
group\u concat()

您可以使用
having
子句获得不同的:

select l.item_id,
       group_concat(l.id order by l.id) as id_ordering,
       group_concat(l.id order by l.message) as message_ordering
from log l
group by l.item_id
having id_ordering <> message_ordering;
选择l.item\u id,
按id排序的组(l.id按l.id排序),
组_concat(l.id按l.message排序)作为消息排序
从日志l
按l.item\u id分组
具有id_订购信息_订购;

您的mysql版本是什么?如何知道要与上一个查询进行比较?逻辑是否类似于为
item\u id
=2选择,并与
item\u id
=1比较?版本为5.6.17这几乎可以工作,但会产生误报。如果你把这些值加在一起,
(3453,4,'A'),(3454,4,'B'),(3455,4,'C'),(3456,4,'D'),(3457,4,'E'),(3600,4,'F')
,第4项也在结果中,它不应该出现。@JuanLopez是的,我明白你的意思。如果您添加一个额外的变量,根据
id
以升序枚举行,则可以很容易地解决这个问题。我看不到它。你介意编辑你的答案并加上这一点吗?这很容易理解,清晰有效。简直太完美了!
select l.item_id,
       group_concat(l.id order by l.id) as id_ordering,
       group_concat(l.id order by l.message) as message_ordering
from log l
group by l.item_id
having id_ordering <> message_ordering;