2011-07-13 34 views
2

我有一個數據模式是這樣的:結構PHP數據

cp 
    id te su 
    1  7  2 
    2  7  1 
    3  6  8 

cl 
    id cp st 
    1  2  5 
    2  2  6 
    3  1  6 

us 
    id na 
    .. .. 
    5  Joe 
    6  Mike 
    7  Tina 
    .. .. 

我想與foo(7)從MySQL

運行PHP函數 foo($te)像這樣的輸出數據
[0] 
    su: 1 
    st_list: 
     [0] 
      id:6 
      na:Mike 
[1] 
    su: 2 
    st_list: 
     [0] 
      id:5 
      na:Joe 
     [1] 
      id:6 
      na:Mike 

我想知道如何最好地做到這一點。現在我能夠使用連接,但結果看起來像這樣

[0] 
    su: 1 
    st_id:6 
    st_na:Mike 
[1] 
    su: 2 
    st_id:5 
    st_na:Joe 
[3] 
    su: 2 
    id:6 
    na:Mike 

su:2重複......顯然這不是在這個例子中的一個問題,問題是,在現實的事情, su代表更多的數據,我會通過「this」(無論我選擇哪種答案)方法。

編輯: 我希望你明白我在問什麼......我知道很多你們的是方式的MySQL和一般的比我更多的發展見地的,所以這就是爲什麼我要問在這樣的一個普通的(我有這種想法),因爲我認爲如果我有更具體的問題,我最終會對它應該運行的方式做出假設)。我想要一個有效的解決方案,因爲這些數據正被用來填充搜索結果。

謝謝!!!!!!!!!!

+0

你將需要使這些更描述性命名,你應該有一個更具描述性的期望輸出。 – cwallenpoole

+0

問題是什麼? –

回答

5

您將需要自行循環播放結果,並以您想要的格式構建數組。 MySQL不能以你想要的嵌套格式給你結果。這裏有一個粗略的草稿(未經測試):

$su = 0; 
$st_list = array(); 
$nested = array(); 
foreach ($results as $row) { 
    if ($su != 0 && $row['su'] != $su) { 
     $nested[] = compact('su', 'st_list'); 
    } 

    if ($su != $row['su']) { 
     $su = $row['su']; 
     $st_list = array(); 
    } 

    $st_list[] = array(
     'id' => $row['st_id'], 
     'na' => $row['st_na'], 
    ); 
} 

$nested[] = compact('su', 'st_list'); 

編輯:通常最好簡單地獲取所有你想使用一個SQL查詢的結果。這幾乎總是最有效的方式。但是,如果它真的對你很重要(並且這是你的應用程序中性能至關重要的部分),那麼肯定知道的唯一方法就是對這兩種方法進行基準測試。很大程度上取決於您的數據庫佈局,行數,SQL索引等。

+0

我必須遍歷結果來構建所需的結構,但對我來說最好是使用JOINS獲取所有數據,然後通過它進行篩選,或者我應該在循環中使用多個查詢和查詢以僅「獲取」我將要使用的數據(即不是獲取重複'su:2'的 – mazlix

+0

我已經更新了我的回答。 –

+0

好吧,謝謝..我不確定更多的數據與更多的命中之間的關係,但最終更小的數據往往是更有效...獎金問題(如果你願意):我會添加一個'加入su = ___'b/c的副本'蘇'的任何問題?(如果不,那麼我可能會這樣做) – mazlix

0
SELECT distinct us.id,na FROM cp 
LEFT JOIN cl ON cp.su = cl.cp 
LEFT JOIN us ON us.id = cl.st 
where te = "7" 

這是否提供您要查找的結果?

或者,

SELECT su,us.id,na FROM cp 
LEFT JOIN cl ON cp.su = cl.cp 
LEFT JOIN us ON us.id = cl.st 
where te = "7" 
ORDER BY su 

更接近你在你的崗位要求的格式。

0

在你的模型,你可以像這些太...

function get_te($te) 
{ 
    $qry = $this->db->get_where('cp', array('te' => $te)); 
    $raw_te = $qry->result_array(); 
    $te = array(); 
    $i = 0; 
    while($i < count($raw_te)) 
    { 
     $te[$i]['su'] = $raw_te[$i]['su']; 
     $qry = $this->db->select('*') 
         ->from('cl') 
         ->join('us', 'us.id = cl.id') 
         ->where('cp', $raw_te[$i]['id']) 
         ->get(); 
     $te[$i]['st_list'] = $qry->result_array(); 
     $i++; 
    } 
    return $te; 
}