3

我想知道是否可以为所有具有相同名称但末尾具有不同编号的表创建动态联合查询。我创建了一个系统,但每个用户都有自己的表,例如:

user_table_$userID

我已经在 PHP 中实现了这一点,但我真的很想创建一个更动态的代码。我目前有 2-3 个嵌套查询来从每个表中获取帖子,而不会对 Web 服务器或数据库造成压力。

我想我可以计算用户登录表中的用户数并创建一个 for 循环:

for ($i = 1; $i >= $usrCount; $i++)
{
    $queryArray[] = "(SELECT post_title, post_description FROM user_table_" . $i . ") UNION";
}

但是如果用户数量非常大,PHP 脚本可能需要很长时间才能加载。有什么方法可以让 Mysql 数据库基于名称为 = "user_table_%" 的表创建动态查询

如果有任何建议,请告诉我。

谢谢你。

4

6 回答 6

1

也许规范化你的数据库会更好,但如果你需要一个动态查询,你可以使用这个:

SELECT
  GROUP_CONCAT(
    CONCAT(
      'SELECT * FROM `',
      TABLE_NAME,
      '`') SEPARATOR ' UNION ALL ')
FROM
  `INFORMATION_SCHEMA`.`TABLES` 
WHERE
  `TABLE_NAME` REGEXP '^user\_[0-9]*$'
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

在此处查看小提琴。

于 2013-04-17T10:45:25.317 回答
0

你不能,即使你找到了一个聪明的黑客,你也不应该这样做。

您最好的选择是重新考虑您的数据库模式。我向你保证,你目前的结构很糟糕,非常非常糟糕。如果你偶然开发了新的 Facebook 怎么办?你会有十亿张桌子吗?

谷歌搜索“数据库规范化”和“第三范式”

于 2013-04-17T10:26:32.837 回答
0

似乎您应该只有一个user_table包含user_id字段的表。

现在,如果您仍想保留当前模型并需要 MySQL 来构建查询,也许您可​​以:

SHOW TABLES LIKE "user_table_%";

创建一个临时表并INSERT SELECT为每个表做。

但同样,至少不建议说

于 2013-04-17T10:32:25.877 回答
0

首先规范化你的表,暂时你可以运行这个查询

SELECT post_title, post_description FROM (select table_name from INFORMATION_SCHEMA where table_name like 'user_table_%';

于 2013-04-17T11:08:05.657 回答
0

这应该可以正常工作(但考虑“数据库规范化”)

for ($i = 1; $i >= $usrCount; $i++){
  $queryArray[$i] = "(SELECT post_title, post_description FROM user_table_".$i.")";
}    
$sql = implode(' UNION ', $queryArray);
于 2017-01-06T01:40:19.563 回答
0

动态查询在 MySQL 中称为视图。这些是包含查询其他表的结果的虚拟表,并且被持久化以便在服务器重新启动后仍然存在。以下是创建包含所有用户帖子的视图的示例:

CREATE OR REPLACE VIEW all_users.posts AS
SELECT * FROM user1.posts
UNION ALL
SELECT * FROM user2.posts;

在此处了解更多信息:

https://dev.mysql.com/doc/refman/8.0/en/views.html

于 2020-01-04T22:52:29.563 回答