2011-10-20 82 views
1

我有一個mysql查詢,它跨2個數據庫連接數據並將新記錄插入其中一個數據庫。如果同一個mysql用戶可以訪問這兩個數據庫,並且它們都在同一臺服務器上,則下面的查詢將起作用。但是,如果每個數據庫具有不同的用戶憑據,您將如何重新編寫?跨不同用戶的2個數據庫的MySQL查詢

PHP腳本片段:

$hard = mysql_connect($hostname_hard, $username_hard, $password_hard) 
     or trigger_error(mysql_error(),E_USER_ERROR); 

# Insert artists: 
mysql_select_db($database_hard, $hard); 
$query_artsync = "insert ignore into {$joomla_db}.jos_muscol_artists 
        (artist_name, letter, added,url,class_name) 
       select distinct 
        artist 
        , left(artist,1) as letter 
        , now() 
        , website, artist 
       from {$sam_db}.songlist 
       where (songtype='s' AND artist <>\"\")"; 
mysql_query($query_artsync, $hard) or die(mysql_error()); 
echo "<br>Artist tables merged! <br><br> Now merging albums<br><br>"; 

So..in的的{$sam_db}數據庫以上是由不同的用戶訪問比{$joomla_db}用戶...
有以下這樣一個比較複雜的插入,但我想想如果我能得到上面的工作,那麼我可能會適用於其他插入查詢相同的原則...

回答

1

你說的是在同一個查詢中使用2個不同的連接,不幸的是,這是不可能的。您需要做的是從一個數據庫中獲取(選擇)所需的所有信息,並使用該信息在另一個數據庫(2個單獨的查詢)上構建插入查詢。

事情是這樣的:

$result = mysql_query("SELECT DISTINCT artist, LEFT(artist,1) AS letter, now() as added, website 
    FROM {$sam_db}.songlist 
    WHERE (songtype='s' AND artist <>\"\"", $sam_con); 
while(($row = mysql_fetch_assoc($result)) != false) 
{ 
    $artist = mysql_real_escape_string($row['artist']); 
    $letter = mysql_real_escape_string($row['letter']); 
    $added = mysql_real_escape_string($row['added']); 
    $website = mysql_real_escape_string($row['website']); 
    mysql_query("INSERT IGNORE INTO {$joomla_db}.jos_muscol_artists 
    (artist_name, letter, added,url,class_name) 
    VALUES 
    ('$artist', '$letter', '$added', '$website', '$artist')", $joomla_con); 
} 

其中$ sam_con和$ joomla_con是你的連接資源。

+0

嗯......我該怎麼做?理論上 - 我跟着你...編程,我不知道該怎麼做...我可以做一個用戶連接單獨運行的select子查詢: user1查詢: 選擇不同的藝術家,左(藝術家,1 )as letter,now(),website,artist from {$ sam_db} .songlist where(songtype ='s'AND artist <> \「\」) 但是我怎麼把user1的查詢結果讀入user2查詢? – cveile

+0

編輯答案 –

+0

-1不正確,您可以根據需要組合任意數量的數據庫中的數據,無論如何都是+0,因爲您的代碼可以正常工作,但是您要對DBserver執行兩次ping操作,而且只需要用戶贈款就夠了。 – Johan

1

您將不得不創建2個獨特的mysql instaces,每個安裝1個。然後使用兩個並進行個別查詢......有道理?

編輯JOHAN

說明...設置連接到這兩個數據庫,我那麼遠?雅知道,mysql_connect ...現在你已經定義了conenction變量...仍然與我?現在在mysql_query中應用這些變量,到目前爲止還不錯? mysql_query($ query,$ connect1)或mysql_query($ query,$ connect2),只是說它沒有意義。 :)現在告訴我,它不會工作?我可以一樣簡單的代碼一個完整的工作示例lol

+0

-1這是廢話 – Johan

+0

真的嗎?它是有道理的,否則只是要求更好的解釋...建立到這兩個數據庫的連接,到目前爲止我?雅知道,mysql_connect ...現在你已經定義了conenction變量...仍然與我?現在在mysql_query中應用這些變量,到目前爲止還不錯? mysql_query($ query,$ connect1)或mysql_query($ query,$ connect2),只是說它沒有意義。 :)現在告訴我,它不會工作?我可以一樣簡單的代碼一個完整的工作樣本大聲笑 –

+0

@Johan,猜你可以回到更多的職位拖動到-1,因爲你做了上面這個和哪裏錯了:) –

1

查詢來自不同數據庫的表沒有問題。

SELECT a.*, b.* 
FROM db1.table1 a 
INNER JOIN db2.table2 b ON (a.id = b.id) 

運行時沒有問題,您的插入查詢也是如此。
但是啓動查詢的用戶需要對涉及的數據庫和表有適當的訪問權限。

這意味着,用戶1(誰不插入)必須是{$sam_db}.songlist

grant版插入+選擇權表{$joomla_db}.jos_muscol_artists和選擇權。如果你不希望擴大現有用戶的權利,那麼您可以創建一個新的inserter用戶,該用戶擁有適當的訪問權限以正確的方式使用這兩個數據庫。
僅限此用戶插入。

不增加用戶
替代解決方案的另一種選擇是創建於DB1黑洞表(從選擇DB)

CREATE TABLE db1.bh_insert_into_db2 (
    f1 integer, 
    f2 varchar(255), 
    f3 varchar(255) 
) ENGINE = BLACKHOLE; 

並附加觸發到,做插入到DB2中。

DELIMITER $$ 

CREATE TRIGGER ai_bh_insert_into_db2_each ON bh_insert_into_db2 FOR EACH ROW 
BEGIN 
    INSERT INTO db2.table2 (f1,f2,f3) VALUES (NEW.f1, NEW.f2, NEW.f3); 
END $$ 

DELIMITER ; 

插入到表db2.table2將如何創建觸發器的用戶的訪問權限發生。

http://dev.mysql.com/doc/refman/5.1/en/grant.html