请教如何在多个规律表名的表查询某个 id 最大值,并确认是哪个表

2022-09-09 18:11:24 +08:00
 killva4624

表说明

查询单个表值示例

select count from @table where id = @id;

思路

是否只能用循环日期+动态 sql 处理?

伪代码如下:

create PROCEDURE findMaxDay(id INT, mouth VARCHAR(255);)
begin
	-- 省略一些赋值

    WHILE x <= 31 DO
        set table_name = CONCAT('summary_',mouth, lpad(x,2,0));
        -- 查询单表结果并赋值
        set sql = CONCAT("select count INTO @tmp from '", table_name, "' where id = '", id,"'");
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        deallocate prepare stmt;
        -- 比较和更新结果
        set @day = IF( @tmp > @max, lpad(x,2,0), @day);
        set @max = max(tmp, max);
        set x = x + 1;
    END WHILE;
    -- 输出结果
    select day;
end

请大佬看看这样的思路对不对?有没有更好的方案。

1330 次点击
所在节点    MySQL
3 条回复
netnr
2022-09-09 18:21:01 +08:00
还有种方式,用 union all ,需要添加一列表名,外面包一层取 max ,性能未知
wxf666
2022-09-09 18:31:03 +08:00
好奇,有这个需求,为啥会这样分表。。
akira
2022-09-09 18:31:48 +08:00
渲染出下面 sql ,然后直接执行就好了呗。 如果你过滤条件都走的索引的话,理论上应该还行

select * from
(select 'summary_20220809' , max(id) `max_id` from summary_20220809
union all
select 'summary_20220808' , max(id) `max_id` from summary_20220808
union all
select 'summary_20220807' , max(id) `max_id` from summary_20220807
union all
...
) a
order by `max_id` desc limit 1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/878970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX