2012-08-25 68 views
1

請看下面的例子:Mysql加入1行與多行 - 組concat或php?

+----------+--------+-------------+----------+ 
| Person_id| Person | Language_id | Language | 
+----------+--------+-------------+----------+ 
| 1  | Bob | 5   | English | 
| 1  | Bob | 3   | Italiano | 
| 1  | Bob | 8   | Deutsch | 
+----------+--------+-------------+----------+ 

和查詢(不是那麼重要,只是腳本向您展示的表結構):

SELECT pl.Person_id, Person, Language_id, Language FROM people as p 
LEFT JOIN people_languages as pl ON p.Person_id = pl.Person_id 
LEFT JOIN languages as l ON pl.language_id = l.language_id 
WHERE pl.Person = 1; 

所以基本上,如果表是在此建造那麼檢索上面所示的所有結果會更好嗎,然後創建一個php函數,它可以創建一個帶有languages_id和語言的Person Model,或者使用group_concat來檢索單個行,然後將語言和languages_id分解到數組中?

順便說一句,不管做什麼,最後我想我有一個角色模型,如下所示:

class Person { 

    public $person_id; // 1 
    public $person; // Bob 
    public $language_id; // Array(5, 3, 8) 
    public $language; // Array(English, Italiano, Deutsch); 

    . 
    . // Functions 
    . 

} 

回答

0

考慮使用字典

class Person { 

     public $person_id; // 1 
     public $person; // Bob 
     //I don't know php but for your idea 
     public Dictionary<int,string> languageList; // KeyValuePairs {(5,English),(3,Italiano),(8,Deutsch)} 
     . 
     . // Functions 
     . 

    } 
+0

據我所知字典像在C#中的PHP :) – Shaokan

+1

不存在雖然我可以像使用一本字典的數組。 – Shaokan

+0

哎呀..我不知道:P – Krishna

2

這裏答案。你可以同時使用這兩種方式,但在我看來,使用組連接要好得多。原因是這會提高性能以及減少php代碼。如果繼續你給你的例子,你將不得不在php端做很多的編碼。有時候在php結束時很難處理。幾個月前我有過這樣的經歷。取而代之的是,使用組concat可以獲取單行,併爲每個人提供所需的一切。在php的最後,簡單地提取Group Concated單元格,然後創建另一個循環或將其放入數組中。這很容易處理。

2

我想你應該查詢分解成多個獨立的模型

應該有Language模式,並將保持這種簡單

class Language 
{ 
    function getId() { return $id; } 
    function getDescription { return $description; } 
} 


class Person { 

public $person_id; // 1 
public $person; // Bob 
public $languages; //this will store array of Language object 

} 

//從數據訪問

function getPerson($person_id) 
{ 
    $person = new Person(); 
    //select only from Person table 
    //fill $person properties from records 
    //$person.person_id = $row['person_id']; etc 

    //select from people_languages joined to language where person_id=$person_id 
    $person->languages = getLanguagesByPerson($person->person_id); //returns array of languages 

    return $person; 
} 

你可以現在有

$person = getPerson(123); 
$person->langauges[0]->getId(); //language id 
$person->langauges[0]->getDescription(); //language id 

$person->langauges[1]->getId(); //language id 
$person->langauges[1]->getDescription(); //language id 

或者循環通過語言

foreach($person->languages as $lang) 
{ 
    //use($lang->getId()); 
    //use($lang->getDescription(); 
} 
+0

這是一個使用兩種模式的googd想法,但是當您需要重新使用它時應該使用它。我的做法是用查詢獲取所有內容並且不要寫太多的代碼 –

+0

當應用程序增長時,可重用性有所幫助 – codingbiz