【问题标题】:How to SELECT from multiple tables in MySQL?如何从 MySQL 中的多个表中进行选择?
【发布时间】:2018-12-30 14:19:24
【问题描述】:

我有很多表具有相同的_ips 结尾。示例:

first-domain.com_ips
secons-domain.com_ips
...

我正在尝试获取 UNION 结果表,该表将包含所有 _ips 表中的所有行。为此我使用:

SELECT id, expirationDate FROM `first-domain.com_ips` WHERE isBlocked = 1
UNION
SELECT id, expirationDate FROM `secons-domain.com_ips` WHERE isBlocked = 1
...;

我有一个由域名组成的数组。所以我正在寻找一种在 SQL 查询中使用这个域数组的方法。也许像我们使用 SELECT 一样。示例:

const ids = [3, 4, 6, 8];
const query = 'SELECT * FROM table WHERE id IN (' + ids.join() + ')';

有没有办法在 SQL 中使用数组作为表名?提前谢谢!

【问题讨论】:

  • 修复你的数据结构!不要为每个域存储单独的表。将域作为一列包含在单个表中。
  • 如果ids 数组中的值有可能来自外部且未经消毒,那么您需要使用准备好的语句来构建查询。
  • 请查看我发布的答案,如果它解决了您的问题,请将其标记为已接受的答案。

标签: javascript mysql sql


【解决方案1】:

您可以通过使用动态查询和正则表达式来做到这一点:

这个动态查询做你想做的事:

SELECT
  GROUP_CONCAT(
    CONCAT(
      'SELECT * FROM `',
      TABLE_NAME,
      '`') SEPARATOR ' UNION ALL ')
FROM
  `INFORMATION_SCHEMA`.`TABLES` 
WHERE
  `TABLE_NAME` REGEXP '_ips$'
INTO @sql;

SELECT @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

这个查询有两个输出,第一个是最终的 SQL 查询字符串,看起来像:

SELECT * FROM `first-domain.com_ips` UNION ALL SELECT * FROM `second-domain.com_ips`

另一个输出是所有表的实际数据,如果你只想要最终数据,你可以去掉这个语句:

SELECT @sql;

【讨论】:

  • 将在最近的时间尝试它,当到达我的电脑时。谢谢!
  • 是的,它有效!但你能解释一下 TABLE_NAME 的来源吗? INTO 和@sql 是什么?
  • TABLE_NAME 是一个占位符变量,它的值来自 INFORMATION_SCHEMA.TABLES ,它保存了数据库中的所有表名,所以当你运行它时,它会用实际的表名替换它,放置一个定义正则表达式“REGEXP '_ips$' 的 where 子句,这意味着,从以 '_ips' 结尾的表列表中获取所有表。@sql 也是选择将其结果放入的变量,因此它保存您的最终查询字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多