2017-09-25 26 views
-1

使用info from this other StackOverFlow question我可以查詢具有相同的表中的所有數據庫的列表:如何查詢列跨多個相同的數據庫中的所有類似的表在MySQL

SELECT 
    table_name, table_schema AS dbname 
FROM 
    INFORMATION_SCHEMA.TABLES 
WHERE 
    table_name = 'myCommonTableName' 

這會給我的數據庫列表有我感興趣的表。現在我的問題是如何查看這些表的值而不是表的名稱。換句話說東西沿着線:

SELECT 
    myCommonTableName.id 
FROM 
    [all tables from all databases - query above] 
WHERE 
    myCommonTableName.someValue > someTest 

換句話說,我希望得到來自所有相同的表(多租戶)的行,所有符合特定條件的數據庫。我需要爲用戶和帳戶管理做到這一點。可能嗎?如果是的話如何?

UPDATE爲了進一步澄清,因爲似乎有些混亂,我不想這樣做:

SELECT * FROM myTable WHERE myTable.id = (SELECT id FROM anotherTable WHERE someOtherCondition)

我試圖做的是一樣的東西:

SELECT * FROM [databaseList].myTable WHERE myTable.id = 1

或者更精確地說:

for(listOfDatabases) 
    SELECT * FROM [database.x].myTable WHERE myTable.id = 1 

基本上,我想所有的一切MyTable的結果在我所有的數據庫,他們有1相同的ID值,它實際上是一個不同的WHERE子句,但你明白了。

+0

@Shadow這不是一個重複的問題。在你的複製問題鏈接假設你已經知道數據庫,並可以使用連接,工會等在我的情況下,我不知道數據庫,可能有一個,但也可能有很多。換句話說,我的查詢需要查找表和數據庫以及這些表中的數據。您提到的問題僅適用於最少數量的數據庫,並且您知道數據庫,並且您正試圖加入它們,但我不想加入它們。 –

回答

-1

您需要將您的/usr/bin/mysql與更高級語言(如bash,python或java)進行交互。選擇一種實現語言。

您建議(基本上)select id from myCommonTableName。您需要在某個數據庫環境(/usr/bin/mysql --database=myDbName)或其他select id from myDbName.myCommonTableName內使用該查詢。

粘性檢票口是數據庫名稱不知道apriori。您有一個提供數據庫名稱的初始information_schema.tables查詢,並且需要bash或其他語言才能將這些數據庫名稱插入完全限定的SELECT語句中。

您尚未授予使用特定輔助語言的權限。但是,假設我們解決bashmysql_creds爲數據庫登錄提供合適的憑據,並且您創建了一個非常好的模板查詢。然後向溶液中可能是這樣的:

echo 'select table_schema as dbname from information_schema.tables where ...' | 
    mysql_creds --database=mysql > /tmp/dbnames.txt 
for DBNAME in `cat /tmp/dbnames.txt` 
do 
    cat template.sql | mysql_creds --database=${DBNAME} | tee /tmp/result-${DBNAME}.txt 
done 

隨意sed模板,如果你想$ DBNAME是每次查詢的一部分。

你可能會發現運行wc -ldiff -u在/tmp/result-*.txt

,可以寫一個存儲過程循環,它

set @q = concat('select option_value from ', scName, '.wp_options ...' 
PREPARE stmt1 FROM @q; 
EXECUTE stmt1; 

但在這一點上,我們已經離開SQL92遠遠落後,我們正在計算字符串並在其上運行eval,在mysql,bash或其他程序中的工作方式非常類似。 OP尚未描述哪種腳本方法最適合他的需求。編寫代碼很難,但經常需要獲取需求。

假設模板查詢提到@[email protected]作爲select的一部分。如果我們希望強加一個新的要求,比如「不會創建兩個以上的數據庫連接」,那麼將其併入一個循環會很簡單:

echo 'select table_schema as dbname from information_schema.tables where ...' | 
    mysql_creds --database=mysql > /tmp/dbnames.txt 
rm -f /tmp/queries.sql 
for DBNAME in `cat /tmp/dbnames.txt` 
do 
    sed -e "s/@[email protected]/${DBNAME}/" <template.sql>> /tmp/queries.sql 
done 
cat /tmp/queries.sql | mysql_creds --database=mysql | tee /tmp/results.txt 
+0

這就是我害怕的原因以及爲什麼我在這裏問... –

+0

不,您不需要涉及任何腳本語言,請在第2個重複問題中查看以下答案:https://stackoverflow.com/ a/13865114/5389997 – Shadow

+0

我不明白這個問題是如何完全重複的。首先,數據庫名稱mydatabase {1,2}已知爲先驗數據,就像在第二個接受答案中出現的名稱數據庫{1,2}一樣。在諮詢information_schema.tables後,OP將需要綜合這些查詢。但到目前爲止,他堅持我們只使用[tag] mysql來構造答案。看起來需要額外的腳本支持來解決他的問題。 –

相關問題