簡體   English   中英

Mysql SELECT 和 UNION 多個具有相似名稱的表

[英]Mysql SELECT and UNION multiple tables with a similar name

我想知道是否可以為所有名稱相同但最后編號不同的表創建動態聯合查詢。 我創建了一個系統,但每個用戶都有自己的表,例如:

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_%”的表創建動態查詢

如果有任何建議,請告訴我。

謝謝你。

也許規范化你的數據庫會更好,但如果你需要一個動態查詢,你可以使用這個:

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;

在此處查看小提琴。

你不能,即使你找到了一個聰明的黑客,你也不應該。

最好的辦法是重新考慮您的數據庫架構。 我向你保證,你目前的結構很糟糕,非常非常糟糕。 萬一你開發了新的facebook怎么辦? 你有十億張桌子嗎?

搜索谷歌關於“數據庫規范化”和“第三范式”

看起來你應該只有一個包含user_id字段的表user_table

現在,如果您仍想保留當前模型並需要 MySQL 來構建您的查詢,也許您可​​以:

SHOW TABLES LIKE "user_table_%";

創建一個臨時表並對每個表執行INSERT SELECT

但同樣,幾乎不建議至少說

首先規范化你的表,暫時你可以運行這個查詢

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

這應該可以正常工作(但請考慮“數據庫規范化”)

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

動態查詢在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM