2013-07-01 15 views
1

我想連接表以防止太多的數據庫查詢,但我不喜歡數據返回的方式。沒有重複數據正確加入表

查詢:

SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id 

返回看起來是這樣的:

Array 
(
[0] => Array 
    (
     [name] => Jim 
     [dog_name] => Wolf 
    ) 

[1] => Array 
    (
     [name] => Jim 
     [dog_name] => Frisky 
    ) 

[2] => Array 
    (
     [name] => Tina 
     [dog_name] => Pokedot 
    ) 

[3] => Array 
    (
     [name] => Tina 
     [dog_name] => Spiky 
    ) 
) 

是否有可能有查詢,而不是返回類似:

Array 
(
[0] => Array 
    (
     [name] => Jim 
     [dog_name] => array(Wolf, Frisky) 
    ) 

[1] => Array 
    (
     [name] => Tina 
     [dog_name] => array(Pokedot, Spiky) 
    ) 
) 
+2

標準數據庫只對關係(即表)進行操作。通常認爲這個表中的單元格存儲數組是不好的(更多詳細信息,請參閱[標準化](https://en.wikipedia.org/wiki/Database_normalization))。如果我是你,我只需在你的程序中解析表格並轉換成你喜歡的形式。 –

回答

8

最接近的解決方案:

SELECT person.name, GROUP_CONCAT(dog.dog_name) AS dog_names 
FROM person JOIN dog ON person.id = dog.person_id 
GROUP BY person.id 

這將返回一個字符串這是一個逗號分隔的狗名稱列表,而不是PHP數組。您必須在應用程序代碼中使用該字符串explode()

請注意,GROUP_CONCAT()的默認長度限制爲1024個字符,並由配置選項group_concat_max_len控制。


我從@KonstantinWeitz的評論表示贊同,這是值得讓RDBMS做什麼這是最好的,然後用PHP代碼進行後處理的結果成你想要的格式。

例如,這裏就是我會做回你所描述的陣列:

$peoplesdogs = array(); 
$stmt = $pdo->query("SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id"); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $peoplesdogs[$row["name"]]["name"] = $row["name"]; 
    $peoplesdogs[$row["name"]]["dog_name"][] = $row["dog_name"]; 
} 
return array_values($peoplesdogs);