Как вернуть и кол строк выборки и данные из этой же выборки с заданным лимитом?

Нужно получить и кол строк из DATA и сами строки но применив LIMIT N.

SELECT
    COUNT(DATA.id) as count
FROM
(
  ##ресурсоемкая задача с блекджеком и JOIN'ами
) as DATA


Догадываюсь что нужно в последней выборке взять все столбцы и добавить к ним столбец count продублировав результат COUNT для каждой строки DATA, но не могу понять как это лучше сделать... и как бы не заставить случайно БД для каждой строки пересчитывать каждый раз по новому COUNT.

SELECT
  *,
  COUNT(DATA.id) as count
FROM
(
  ##ресурсоемкая задача с блекджеком и JOIN'ами
) as DATA LIMIT 150
##просит добавить GROUP BY для всех колонок DATA, а потом показывает во всех строках в колонке count 1


UPD: Вопрос решен но не полностью. Можно добавить колонку c count с помощью WITH но задача выполняется дважды либо класть результат во времянку что увеличит использование памяти. Возможно решения с одной выборкой и без времянки не существует.
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 4
@mletov
Вынесите "ресурсоемкую задачу" в временную таблицу.

Из нее посчитайте count и положите в скалярную переменную

А потом уже сделайте выборку из времянки, только доп столбцом добавьте скалярную переменную
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
В африке есть такая птица - страус.
В случае опасности она втыкает голову в песок.
Поскольку при этом она перестает видеть хищника, и думает что хищник тоже её теряет из виду.

Все эти попытки и на ёлку влезть и на пони покататься - получить одним запросом и кусок данных, и полное количество - это как раз такое втыкание головы в песок. В наивной надежде что бд там у себя внутри как-то волшебным образом откуда-то прочитает полное количество и отдаст его без напряга. Не отдаст. Там внутри будет все равно два запроса. И хорошо если без временной таблицы.

Для тех, кому ехать, а не шашечки. единственный реальный и осмысленный вариант
SELECT COUNT(*) FROM ## задача с блекджеком и JOIN'ами
SELECT * FROM /* задача с блекджеком и JOIN'ами */ LIMIT 150


а "ресурсоёмкие" запросы надо оптимизировать. чтобы они перестали быть ресурсоёмкими.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для MySQL 8
WITH `tmp` AS (
  ##ресурсоемкая задача
)
SELECT `tmp`.*, `s`.`count`
  FROM `tmp`
  JOIN (
    SELECT COUNT(*)
      FROM `tmp`
  ) AS `s`
LIMIT 150
Ответ написан
Revencu
@Revencu
После вашего запроса вызовите это:
select FOUND_ROWS();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы