Подсчитать количество type = 1
из action_log
, добавить 20 и записать его в переменную:
SET @typeCount = (
SELECT COUNT(*)
FROM action_log
WHERE
type = 1
);
SET @typeCount = 20 + IFNULL(@typeCount, 0);
А затем применить его в prepared statements:
PREPARE stmt FROM '
SELECT
history.*,
users.id
FROM
(
SELECT *
FROM action_log
WHERE
action_id > 10
ORDER BY
action_id DESC
LIMIT ?
) AS history
LEFT JOIN users ON history.user_id = users.id
ORDER BY
action_id DESC
';
EXECUTE stmt USING @typeCount;
DEALLOCATE PREPARE stmt;
UPDATE:
При подсчете количества можно настроить условие выборки по своему. Подсчет количества с type = 1
будет примерно таким:
SET @typeCount = (
SELECT COUNT(*) AS rowcount
FROM
(
SELECT *
FROM
action_log
LIMIT 20
) h
WHERE
h.type = 1
);
SET @typeCount = 20 + IFNULL(@typeCount, 0);
Ну или можно попробовать выполнить одним select
-ом. Но тяжело это воспроизвести без структуры таблиц и данных - примерно так:
SELECT
history.*,
users.id
FROM
(
SELECT *
FROM
(
SELECT
(@row_number := @row_number + 1) rownum,
t.rowcount,
a.*
FROM
action_log a
CROSS JOIN (
SELECT COUNT(*) rowcount
FROM
(
SELECT *
FROM
action_log
LIMIT 20
) h
WHERE
h.type = 1
) t
CROSS JOIN (
SELECT @row_number := 0
) n
WHERE
action_id > 10
) l
WHERE
l.rownum <= l.rowcount + 20
) history
LEFT JOIN users ON history.user_id = users.id
ORDER BY
action_id DESC