【问题标题】:Print/Display Subquery Count in mySQL在 mySQL 中打印/显示子查询计数
【发布时间】:2021-11-16 01:44:58
【问题描述】:

我这里有一个存储过程,它将根据导入表更新用户表。

CREATE PROCEDURE `UpdateUsers`()
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    SHOW ERRORS;
      ROLLBACK;
END;

START TRANSACTION;
UPDATE users SET status='A'
WHERE id IN (SELECT DISTINCT ID FROM import);
    
COMMIT;

END

如何打印/显示子查询 SELECT DISTINCT ID FROM import 的计数。我可以在这个子查询上创建一个变量吗?

【问题讨论】:

  • 您想要子查询中的行数、子查询中不同的ids 还是实际更新的行数?目前还不清楚你真正想要什么。注意:这些都可以不同。
  • @GordonLinoff 我想计算子查询中的行数。

标签: mysql sql stored-procedures


【解决方案1】:

使用 ROWCOUNT 此命令告诉您从执行的最后一个查询中读取数据库的行数。您可以先执行查询(SELECT DISTINCT ID FROM import)来了解会影响多少行并验证是否正确

将@@ROWCOUNT 设置为受影响或读取的行数。

这是一个例子。

USE AdventureWorks2012;  
GO  
UPDATE HumanResources.Employee   
SET JobTitle = N'Executive'  
WHERE NationalIDNumber = 123456789  
IF @@ROWCOUNT = 0  
PRINT 'Warning: No rows were updated';  
GO  

here 是关于它的更多信息。

【讨论】:

    【解决方案2】:

    您可以使用COUNT(*) 来计算查询返回的所有行数,或者使用COUNT(DISTINCT ID) 来获取查询中所有不同 ID 的计数。我想这可以帮助你:https://www.javatpoint.com/mysql-count#:~:text=MySQL%20count()%20function%20is,not%20find%20any%20matching%20rows.

    无论如何这将是实现:

    CREATE PROCEDURE `UpdateUsers`()
    BEGIN
    
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        SHOW ERRORS;
          ROLLBACK;
    END;
    
    START TRANSACTION;
    UPDATE users SET status='A'
    WHERE id IN (SELECT DISTINCT ID FROM import);
    COMMIT;
    SELECT COUNT(DISTINCT ID) FROM import;
    END
    

    或者,如果您希望此值位于变量中,则如下所示:

    DECLARE COUNT_DISTINCT INT;
    SET COUNT_DISTINCT =(SELECT COUNT(DISTINCT ID) FROM import);
    

    【讨论】:

    • 但您调用 SELECT FROM import 两次。而且效率不高。
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多