2015-01-20 95 views
0

我是MySQL的新手,我正在嘗試做以下事情,並希望我可以用單一的PHP查詢MySQL調用,而不必打電話,在PHP中存儲,調用,存儲在PHP等PHP/MySQL是否存在SELECT ... INSERT和/或SELECT ... INSERT ... DELETE

這是我的數據庫設置。 1.用戶的表格,包括電子郵件地址。 2.通過電子郵件地址和邀請被邀請者的用戶列表的「被邀請者」表3.「朋友」的表格

我想加入用戶的表格並與被邀請者的表一起確定哪些被邀請者已經註冊爲用戶以及誰邀請他們(請記住他們可能已經被超過1人邀請)。從那裏我將新登記的被邀請者和邀請他的人一起插入朋友表。最後,我會從受邀請的表格中刪除該受邀者,以便他不會繼續收到邀請。

我看到如何做到這一點與3個單獨的PHP調用到MySQL:1 JOIN找到用戶在用戶表和受邀者表(加入也將確定誰邀請他們)2. INSERT將該對放入朋友表中3. DELETE將用戶從被邀請者列表中刪除。

但是,這將是更高的流量/較少優化與MySQL服務器的多次調用,還有我的PHP腳本存儲的很多數據,我真的只需要下一個MySQL調用。我有一種感覺,這應該是可能的只有1次調用沒有數據返回到PHP腳本。

我看到有一個INSERT ... SELECT MySQL調用(http://dev.mysql.com/doc/refman/5.0/en/insert-select.html),但我還沒有找到一種方法來組合上面的第1步和第2步,這將是一個SELECT ... INSERT選項。這是否存在?我嘗試了以下方法,但沒有奏效......像這樣的東西將是我的理想。

SELECT users.user as user1, invited2.user as user2, invited2.email as email2 FROM users RIGHT JOIN invited2 ON users.email=invited2.invitee; 
INSERT INTO friends (user, friend) VALUES (user1, user2), (user2, user1); 
DELETE FROM invited2 WHERE invited2.email = email2; 

INSERT INTO前面的部分工作對自己,但就像我說的,如果我只是返回到我的PHP腳本,我只好來存儲所有結果,然後調用第二個自己。有一種方法可以在一次通話中做到這一點?如果是這樣,事後還有一種方法可以處理刪除語句(從invite2 WHERE invitee = users.email刪除)?

任何意見,將不勝感激。提前致謝。

+0

你可以用'INSERT .... SELECT'加上'DELETE'語句創建一個存儲過程。 – 2015-01-20 20:55:30

+0

@JayBlanchard感謝您的建議。我一直在想這是一個備份計劃,但我聽說過對存儲過程的複雜評論,特別是對於可移植性和數據庫服務器的流量保留,所以我希望避免這種情況。 – 2015-01-20 21:04:08

+0

您應該使用數據庫服務器來處理涉及數據的繁重任務,並儘可能多地保留PHP以外的數據操作代碼。存儲過程*非常*便攜,誰給你不好的評論誰就是在吠叫錯誤的樹。 – 2015-01-20 21:10:27

回答

0

的MySQL確實提供了一個INSERT ... SELECT(http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

你的SQL可以編輯:

INSERT INTO friends (user, friend) 
SELECT users.user as user1, invited2.user as user2 
FROM users 
RIGHT JOIN invited2 ON users.email=invited2.invitee; 

DELETE invited2 
FROM users 
RIGHT JOIN invited2 ON users.email=invited2.invitee; 

在這種情況下,INNER JOIN似乎讓比RIGHT JOIN更有意義。

+0

你能否也解決這個問題的'DELETE'要求? – 2015-01-20 20:50:52

+0

@ Mr.Llama感謝您的關注。我的刪除語句會從被邀請者刪除郵件地址與用戶表中用戶的電子郵件地址相匹配的行。 – 2015-01-20 20:54:28