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