Для начала вам просто нужно исправить JOIN
, синтаксис которого неверен (как правило, предложение WHERE
идет после всех JOIN
s, и мы предпочитаем явные объединения неявным объединениям).
Также, как прокомментировал Мадхур Бхайя, использование фильтров с увеличенными переменными является сложным. Чтобы это работало должным образом, нам нужно объединить две таблицы в подзапросе и выполнить упорядочение внутри самого подзапроса, а затем перейти к логике переменных.
Рассмотрим:
SELECT id, type, timestamp, text
FROM (
SELECT
t.*,
@rn := CASE WHEN @type = type THEN @rn + 1 ELSE 1 END rn,
@type := type
FROM
(
SELECT t.*, t2.text,t2.id2
FROM mytable t
INNER JOIN mytable2 t2 ON t2.id2=t.id AND status=1
ORDER BY type, timestamp
) t
CROSS JOIN (SELECT @type := NULL, @rn := 1) x
) x
ORDER BY FLOOR((rn - 1)/3), type, timestamp;
Демонстрация на DB Fiddle :
| id | type | timestamp | text |
| --- | ---- | --------- | ---- |
| 1 | A | 101 | x |
| 2 | A | 102 | x |
| 5 | A | 105 | x |
| 3 | B | 103 | y |
| 4 | B | 104 | y |
| 6 | B | 106 | y |
| 7 | A | 107 | x |
| 8 | A | 108 | x |
| 9 | B | 109 | y |
| 11 | B | 111 | y |