Вы можете использовать переменные, чтобы решить эту проблему как проблему пробелов и островков .
Следующий запрос:
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
и message
:
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;
Демо здесь