如何使用另一个表的select count(id)设置limit的值| mysql

v09wglhw  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(561)

我有一个场景,其中结果必须受限,这取决于对另一个表中的id进行计数。
假设我有这两张table counter 以及 dispanser ,
我想 select 表中最后的记录 counter 并通过计算中的记录数来限制选择 dispanser table。
像这样的

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

2lpgd9681#

如果不使用准备好的语句或存储过程,则无法执行此操作。根据手册:
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 ;

D小提琴

t9aqgxwy

t9aqgxwy2#

您可以尝试使用动态sql。
设置变量 @num 从…得到一笔钱 dispanser table。
准备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公司

cbeh67ev

cbeh67ev3#

根据评论中的对话,听起来你想做的是从 counter 对于中的每条记录 dispanser -如果这是错误的,请评论,我可以调整我的React。最好的方法是通过将子查询与 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

相关问题