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

讨论 未结 3 45
killva4624
killva4624 会员 2022年9月9日 10:43 发表
<h1>表说明</h1> <ul> <li>表名:固定的前缀+%Y%m%d, 如 <code>summary_20220809</code></li> <li>表结构:count BIGINT, id BIGINT</li> </ul> <h1>查询单个表值示例</h1> <pre><code class="language-mysql">select count from @table where id = @id; </code></pre> <h1>思路</h1> <p>是否只能用循环日期+动态 sql 处理?</p> <p>伪代码如下:</p> <pre><code class="language-sql">create PROCEDURE findMaxDay(id INT, mouth VARCHAR(255);) begin -- 省略一些赋值 WHILE x &lt;= 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 &gt; @max, lpad(x,2,0), @day); set @max = max(tmp, max); set x = x + 1; END WHILE; -- 输出结果 select day; end </code></pre> <p>请大佬看看这样的思路对不对?有没有更好的方案。</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
3个回复
  • netnr
    2022年9月9日 10:43
    还有种方式,用 union all ,需要添加一列表名,外面包一层取 max ,性能未知
    0 0
  • wxf666
    2022年9月9日 10:43
    好奇,有这个需求,为啥会这样分表。。
    0 0
  • akira
    2022年9月9日 10:43
    渲染出下面 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
    0 0