2016-07-30 28 views
1

我有一个MySQL数据库,并有100个表中名为,table_1,table_2,table_3等... 在我的bash脚本中,我只想从table_20中选择10个表格table_29。我试了下面的代码:从MySQL中选择N个特定的表

show tables where Tables_in_db REGEXP '^table_[20-29]' 

但它把2,0,9作为单独的数字,而不是将20和29识别为数字。

我该如何修改我的查询?

+0

'table_NN'通常是设计模式的一种不好的方法。 –

+0

以及我只是使用数据库,而不是设计它 – pku

回答

5

表名的数字序列相匹配table_20table_29的正则表达式是:

^table_2[0-9] 

所以您的查询应该是:

SHOW TABLES WHERE Tables_in_db REGEXP '^table_2[0-9]' 
+0

看来我误解了这个问题,这回答了这个问题:) ++ – sjsam

+0

@sjsam你的答案没有错,至少它肯定是相关的。 –

+0

我在想,为什么只用'REGEXP'来处理它时,为什么还要使用一个外部数据呢。另外我读了一个问题,例如'给我表格20到29',我的 - 现在被删除的答案 - 就足够了;) – sjsam

0

如果你可以使用外部工具,那么awk是你的朋友,例如:

mysql -u root -p -se "show tables from db_name" | awk '/^table_2[0-9]$/' 

这给你table_(20-29)如您所愿。请注意0​​用mysql来摆脱格式。

0

你可以使用INFORMATION_SCHEMA.TABLES

SELECT * 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'table_%' 
ORDER BY CAST(REPLACE(TABLE_NAME, 'table_', '') AS INT) 
LIMIT 20,10; 

工作原理:

  1. 获取具有特定名称约定的所有表即与table_

  2. 排序开始按编号后缀

  3. 使用LIMIT offset, count


我不知道你的特定的模式,但多个具有通用前缀的表可以表明设计不佳。

相关:SELECT * FROM sales + @yymm