2012-04-16 118 views
0

我有一個用戶數據庫,其中有一個名稱,地址等的主表。然後,我爲用戶的孩子,寵物,培訓課程和教育結果等有單獨的表格。MySQL在一個查詢中從多個不同的表中選擇數據

此用戶的詳細信息可以全部顯示在同一頁面上,而我目前的做法是首先查詢數據庫中的用戶主要詳細信息。然後我單獨查詢其他表並使用循環顯示此信息。

我真的只需要知道這是否是最好的方式來做到這一點,或者是否有一種方法來處理單個查詢,並且有什麼優勢?

表的基本結構是:

+----------------+ +-----------------------+ 
| Users   | | Children    | 
+----------------+ +-----------------------+ 
|ID |Name |Age | |ID |UserRef |Name |Age | 
+----------------+ +-----------------------+ 
|1 |Jim |53 | |1 |1  |Joe |11 | 
|2 |Karl |37 | |2 |1  |Jane |9 | 
+----------------+ |3 |2  |Amy |15 | 
         +-----------------------+ 

這是一個基本的版本,並只顯示用戶和兒童桌。其他表與子表相似,因爲它們引用用戶表併爲單個用戶提供多個記錄。

在此先感謝。

+0

更清楚你的問題,分享你想要的結果。 – 2012-04-16 14:15:40

+0

這的確很簡單。我建議你先寫下哪些列有問題,以及它們屬於哪個表。然後寫下你想要的最終結果表的輸出結果。瞭解輸入和輸出後,您可以形成並編寫一條SQL語句,以提供所需的輸出。首先,您只需要正是你想要你寫的語句之前,所以一切都按您所預期的 檢查我的答案,讓我知道如何去 – Pavan 2012-04-16 14:29:01

回答

0

你可以在users.id = children.userref上做一個簡單的LEFT JOIN表。然而,由於這是一對多的關係,你需要使用一些GROUP BY魔術:

SELECT users。*,GROUP_CONCAT(children.id ORDER BY children.id ASC)as childrens_ids,GROUP_CONCAT(children。名字ORDER BY children.id ASC)AS childrens_names,GROUP_CONCAT(children.age ORDER BY children.id ASC)AS childrens_ages FROM users LEFT JOIN children ON users.id = children.userref GROUP BY children.userref

你會那麼必須使用代碼來解析/爆炸孩子的ID,姓名和年齡。儘管如此,這並不一定是你應該做的。在MySQL端不一定更快,並且您會看到在後端代碼中需要做多少額外的工作。我的建議是嘗試一下,看看它如何影響你的表現。

+0

我認爲這是要走的路。我會試一試,看看它是如何影響性能的。 – Sean 2012-04-16 15:11:01

0

這裏有一個很好的查詢開始:

SELECT * FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef 

注意,這會給你兩個值叫做「名」 - 這就是爲什麼你需要使用別名:

SELECT Users.Name as ParentName, Children.Name as ChildName FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef 

你可以使用上述格式添加您需要的任何其他字段。

至於是否更好要使用這個,每種方法都有其優點和缺點。當您創建一個更大,更高級的查詢來執行您想要的操作(而不是許多更小的查詢)時,您的腳本將運行得更快,因爲不是有1 +(父數)查詢發送到服務器並返回,那裏只會是一個查詢。然而,組織不好的查詢可能會在以後回到調試時遇到麻煩,並且不記得爲什麼按照您的方式進行調試。

+0

任何保健佳品,爲什麼這是downvoted SQL查詢做什麼知道嗎?我認爲這是一個很好的迴應,他涵蓋了所有的基礎。 – tcole 2012-04-16 14:22:52

+0

另一個用戶有一個簡短的評論得到了其下投票,所以我懷疑這是報應。感謝您的支持。 – Tim 2012-04-16 14:24:05

相關問題