我现在有一个sql,
去重查询某两个字段之后,得到了4条数据;
并且我加了计数,但是现在的计数是:未去重的计数:12;
这个计数怎么写出,去重之后的 4条数据呢?
SELECT COUNT(DISTINCT 去重列名称1, 去重列名称2)
FROM 表名称;
试试
SELECT
lot_number,
creator,
COUNT(*) OVER() AS total
FROM
(
SELECT DISTINCT
lot_number,
creator
FROM pipline.qr_code
) t
分组也可以
使用主键索引来优化数据分页
select * from user where id>(select id from user where id>=**100000** limit **1**) limit **20**; //time **0**.003s
使用explain分析语句,MySQL这次扫描的行数是8W+,时间也大大缩短。
explain select * from user where id>(select id from user where id>=**100000** limit **1**) limit **20**;
要实现在MySQL去重查询后计数结果,可以使用以下步骤:
确保有建立存储过程的权限,如果没有,需要联系数据库管理员获取权限。
创建一个存储过程,命名为"countUniqueRecords"(可以根据实际需求进行命名),并传入参数"num"表示需要查询的记录数。
在存储过程内部,使用循环遍历每个表以插入指定数量的测试数据。例子中是通过一个主循环遍历每个表,并在内部循环中执行插入语句。
在每次循环开始前,先删除表中之前的记录,以防止重复插入。
在内部循环中,使用动态SQL语句构建插入语句,并执行该语句。插入语句中的表名使用了拼接,根据循环变量动态生成。
循环完成后,可以通过SELECT COUNT(DISTINCT id) FROM 表名 来获取去重后的记录数。
下面是一个示例的存储过程实现代码:
CREATE PROCEDURE countUniqueRecords(IN num INT)
BEGIN
DECLARE i INT;
DECLARE j INT;
SET i = 0;
WHILE i < 10 DO
-- 删除之前的表记录
SET @delSqlStr = CONCAT('DELETE FROM log_2019_0', i);
PREPARE delStmt FROM @delSqlStr;
EXECUTE delStmt;
SET j = 1;
WHILE j < num DO
-- 每个表新增指定的num记录数
SET @sqlStr = CONCAT('INSERT INTO log_2019_0', i, '(`id`, `content`, `createTime`) VALUES (', j, ', \'测试\', \'2019-0', i, '-01 10:00:00\')');
PREPARE stmt FROM @sqlStr;
EXECUTE stmt;
SET j = j + 1;
END WHILE;
SET i = i + 1;
END WHILE;
-- 获取去重后的记录数
SELECT COUNT(DISTINCT id) FROM log_2019_0;
END
通过调用该存储过程,并传入需要查询的记录数,即可得到去重后的计数结果。例如:
CALL countUniqueRecords(4);
这样就能将去重后的记录数返回给调用者。