2010-11-01 278 views
0

在假設情況下,我有一對數據庫表,在一對多關係中。我試圖找到一個不錯的查詢功能,這樣我可以表A與表B中的所有鏈接的行的嵌套數組返回的每一行查詢返回多維分組數組

SELECT a.id AS id,a.name as name,b.id AS b_id,b.name AS b_name FROM a,b WHERE a.id=b.eid; 

將返回結果只有一個

SELECT 
    a.id AS id, 
    a.name as name, 
    GROUP_CONCAT(b.id) AS b_id, 
    GROUP_CONCAT(b.name) AS b_name 
FROM a,b 
WHERE a.id = b.eid; 

然而這返回我想要的,但我後面的數組不是一個字符串(可能有逗號b.name)

我錯過了什麼?

+0

什麼是鏈接的密鑰?是b.id一個外鍵? – Stephen 2010-11-01 22:09:54

+0

多數民衆贊成在一個良好的點鏈接的關鍵將是別的 - b.eid,我已經更新了上述查詢 – kalpaitch 2010-11-01 22:10:58

+0

你可以更精確什麼想要完成... 據我瞭解,你應該使用explode()? – Breezer 2010-11-01 22:12:51

回答

1

您可以使用分離器不同於逗號:

GROUP_CONCAT(b.name SEPARATOR ';') AS b_name 
+0

是的完美,歡呼,只是想到了我自己。出於好奇,如果不能保證任何字符或字符組合不會在值b_name中。其他方法嗎? – kalpaitch 2010-11-01 22:21:52

+0

好吧,你可以使用一個非常長的隨機分離器,一旦你爆炸它們就會消失使它變成3個標誌並且我懷疑它們會與普通文本混淆 好分隔符「#&£」= D – Breezer 2010-11-01 22:28:46

+0

你可以使用其他分隔符char轉義現有的分隔符char:'GROUP_CONCAT(REPLACE(b.name,';',';;')SEPARATOR';')AS b_name'但是在使用這些數據時也需要特殊的處理。 – 2010-11-01 22:32:40

1

這是不可能返回其他任何比MySQL的數據類型,所以簡單的答案是不,你不能返回的陣列(嵌套的或其他)來自子查詢的結果。你也會看到一些非常激烈的性能命中試圖從外部建立字符串連接的值,子字符串的順序將是隱含的,正如你所暗示的,你會在選擇合適的分隔符時遇到問題。

使用簡單的JOIN創建單個結果集幾乎肯定會更高效。應該以編程方式處理任何關於關係「一方」的副本(這在任何意義上都更可取,以處理多個連接字段上的字符串分割)。