Как установить значение LIMIT, используя счетчик выбора (id) из другой таблицы | MySQL - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть сценарий, в котором результат должен быть ограничен в зависимости от подсчета идентификаторов в другой таблице.

Предположим, у меня есть эти две таблицы counter и dispanser,

я хочу select последние записи в таблице counter и ограничить выбор путем подсчета количества записей в таблице dispanser.

как то так

select * from counter limit (select count(dispID) from dispanser) 

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Вы не можете сделать это без использования подготовленных операторов или хранимой процедуры. Из руководства :

LIMIT принимает один или два числовых аргумента, которые оба должны быть неотрицательными целочисленными константами

В хранимой процедуре вы можете сделать что-то вроде этого. COUNT(dispID) сохраняется в cnt, и эта переменная затем используется в качестве параметра LIMIT. Это исключение из вышеупомянутого правила.

DELIMITER //
CREATE PROCEDURE select_counter()
BEGIN
  DECLARE cnt INT;
  SELECT COUNT(dispID) INTO cnt FROM dispanser;
  SELECT * FROM counter LIMIT cnt;
END //
DELIMITER ;

DBFiddle

0 голосов
/ 10 ноября 2018

Исходя из разговоров в комментариях, похоже, что вы пытаетесь получить счет от counter для каждой записи в dispanser - если это не так, пожалуйста, прокомментируйте, и я могу скорректировать свой ответ , Лучший способ выполнить то, что вы ищете, - объединить подзапрос с синтаксисом GROUP BY. Нечто подобное может работать, в зависимости от вашей схемы:

SELECT
   d.*,
   c.total
FROM
   dispanser as d
INNER JOIN (
   SELECT
      COUNT(*) as 'total',
      dispID
   FROM
      counter
   GROUP BY
      dispID
   ) as c
   ON c.dispID = d.id
0 голосов
/ 10 ноября 2018

Вы можете попробовать использовать динамический SQL.

Установите переменную @num, чтобы получить сумму из таблицы dispanser.

подготовил ваш оператор SQL CONCAT('select * from counter limit ', @num ).

Окончательное использование EXECUTE для динамического выполнения SQL.

SET @sql = CONCAT('select * from counter order by counterID desc limit ', (SELECT count(dispID) from dispanser));

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

sqlfiddle

...