【问题标题】:SQL Query to SELECT from multiple Schema's从多个模式中选择的 SQL 查询
【发布时间】:2022-07-05 18:44:26
【问题描述】:

我有一个包含很多用户(模式)的数据库,例如:

  • user_1
  • user_2
  • user_3
  • ...
  • user_303

所有这些都有相同的表,例如:

CREATE TABLE `messages` (
  `id` int(11) NOT NULL,
  `content` text COLLATE utf8mb3_unicode_ci NOT NULL,
  `date` datetime NOT NULL,
  `viewed` int(11) NOT NULL,
  `forId` int(11) NOT NULL,
  `fromId` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;

INSERT INTO `messages` (`id`, `content`, `date`, `viewed`, `forId`, `fromId`) VALUES
(1, 'Hello World', '2020-06-04 14:49:17', 1, 2106, 1842),
(2, 'Hi there', '2020-06-04 14:49:39', 1, 2106, 1842),
(3, 'test 1', '2022-01-03 11:40:43', 1, 3006, 3006),
(4, 'Test 2', '2022-01-20 12:01:52', 1, 1842, 1842);

我想要的是一个查询,例如:

USE user_1, user_2, user_3;

SELECT * FROM `messages` WHERE `content` LIKE `%Hi%`;

我不知道这是否可以作为 SQL 查询,另一种选择是编写一个带有 for each 循环的小型 PHP 代码,但我想要一个命令,所以我得到了所有用户的列表:user_1 till user_303

用户不是从1到303有一些用户被删除,可能是user_200不存在了。

希望有人能帮帮我

【问题讨论】:

  • 您应该有一个通用的消息表 - 供所有用户使用。
  • 我同意 jarlh,将用户属性添加到消息并为所有消息使用一个表。也就是说,您可以将架构作为 select table_schema from information_schema.tables where table_name = 'MESSAGES' 获取,然后循环或创建联合查询。
  • 我有一个包含很多用户(模式)的数据库 你的意思是有很多用户,每个用户都使用自己独立的数据库吗? 我不知道这是否可能 不,这是不可能的。但是您可以在查询中访问来自不同数据库的表,例如:SELECT * FROM db1.table UNION ALL SELECT * FROM db2.table;
  • 一个合格的表名可以包括架构,例如 user_1.messages、user_2.messages 等,您不必切换架构来执行此操作..如果架构数量容易更改以实现灵活性动态sql 会帮助dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
  • 这是一个非常糟糕的数据库设计,所以最好花点时间修改你的设计,然后查询会很容易

标签: mysql sql


【解决方案1】:

您可以使用以下内容编写您想要的查询。

USE information_schema;

SELECT concat("SELECT * FROM ", table_schema,".",table_name, " UNION ALL ") 
FROM tables WHERE table_name = 'messages';

你会得到这样的东西;

SELECT * FROM base.messages UNION ALL
SELECT * FROM c.messages UNION ALL

然后您可以运行此查询以获得您想要的。

【讨论】:

  • 是的,现在我得到一个包含 238 行的列表作为返回,但没有内容/值...
  • 接下来您必须将结果作为查询运行。
【解决方案2】:

在 Oracle 中,您只能连接 2 个参数,因此您必须使用嵌套来连接两个以上的参数。 你也应该使用 ALL_TABLES 而不是 information_schema

SELECT concat(
                'SELECT MESSAGE FROM ', concat(
                                                OWNER,concat(
                                                            '.',concat(
                                                                        TABLE_NAME, ' UNION ALL ')))) 
FROM ALL_TABLES 
WHERE OWNER LIKE 'user_%';

不要忘记从结果中删除最后一个 UNION ALL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    相关资源
    最近更新 更多