mysql如何在多个表中查询指定数据

bravility
  • 239

1.问题描述
假设数据库中存在n个游戏订单表,表名格式为game_[0-9a-z]+_order.
已知存在订单号18demo000001,如何比较高效地查出这个订单在哪个游戏表?

2.自己做的思考
目前能想到的就是先列出所有的游戏表

show tables like "game_%_order"

然后再手动一个一个地查,但是这样效率太低。
是否有更好的方法比较高效的查询?

3.注:仅讨论该场景的解决方法,不必讨论该场景的合理性。实际上订单号是有游戏信息的,但是不知道为何没有落到它对应的游戏的游戏表中,所以需要进行整个库的全表查询。请把表和订单当成没有任何关系


4.另注:谢谢大家的回答,看来并没有更好的方案了,本来想着能否使用show tables like "game_%_order"去获得全部表名的数组。然后select * from 表名数组 where orderID = "18demo000001" 的思路去解决的。但是无论是show tables 赋值给数组,还是select from 数组,这个在mysql中都好像不能实现。
后来者如果在这条思路上有相关的实现欢迎回答讨论,目前的做法是手动查了一百多种表找到了出错数据所在的位置。
具体做法是

update  game_demo1_order set ext1 = "debug" where orderID = "18demo000001";
update  game_test2_order set ext1 = "debug" where orderID = "18demo000001";
......
update  game_table100_order set ext1 = "debug" where orderID = "18demo000001";

如果这个表有这个数据,navicat(mysql命令行或者其他工具应该也)会提示受影响的行: 1,如果这个表没数据,会提示受影响的行: 0
其中ext1是表中的预留字段或者说无实际意义并且不影响业务的字段
写100行update使用了一些小技巧,复制show tables like "game_%_order"的结果(表名)到sublime,使用find all找\n,使多光标出现在每一行,输入updateset ext1 = "debug" where orderID = "18demo000001";
拿到结果后复制到sublime,全局搜索即可
图片描述

回复
阅读 3.4k
4 个回答

你这样的话只能全表去查了.
可以把订单号hash一下.然后存到相对于的表中.这样不就好找了吗

规则问题了。应该详细的描述一下game_[0-9a-z]_order的命名规则,有两种方式
1- game_%game_id%_orders: 此时你的订单编号本身应该带有game_id的,这样你就可以根据game_id知道去哪里找了
2- game_%begin%_%end%_orders: 纯数字的订单标号,人为的规定每十万订单一张表,然后你自然可以算出在哪个表里。

事实上如果数据量大到需要分表的话逻辑还要复杂的多,需要专门的进程去维护一组读表,这些表可能根据game索引,可能根据user索引,可能根据日期索引。当插入数据的时候只是放入处理池,而独立进程会分析该数据发送给各个表。

首先,没有规则没有关系的订单号和表名,就是耍流氓,什么都不用说,直接拉出去砍了
然后,按照规则找不到对应的表,那就是要么你理解的规则有问题,要么就是规则本身出了问题
总之,给个订单号,没有规则,找不到对应的表,那就只有遍历所有的表,没有其他方案。So..好好定义你的规则去吧!

convert MySQL to ES 或根据规则为表集建立索引,索引指向表集,表集指向数据集,数据集指向rows,出结果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏