2014-05-01 38 views
0

我有3個表。一個使用path和object_id(不唯一)保存某些活動的報告,另一個使用object_id可以獲得用戶id,另一個可以從中獲取適當條目的電子郵件。來自SQL數據庫的有效數據重新約定

我需要的是在

email1 { 
    objectid1 { 
    path1 
    path2 
    ... 
    } 
    objectid2 { 
    path3 
    ... 
    } 
} 
email2{ 
    ... 
} 

形式的陣列等

我用SELECT DISTINCT首先想到檢索電子郵件,然後其中的foreach獲得這些object_ids和foreach獲取路徑,但是這會導致大量的數據庫查詢,有沒有更好的方法來做到這一點?

+0

線爲什麼不使用JOIN? –

+0

我將如何實施加入案件?獲得我需要的結果?它可能會很晚,我可能會覺得很慢:/ 用於獲取電子郵件我使用連接 – Limiter

+0

其實,也許我可以使用連接來生成一堆用電子郵件加入的行,然後用PHP解析它? – Limiter

回答

0

我最終做得有點不同,但得到了理想的結果,從某種意義上說,我可以進一步解析數據,因爲我需要它。解決方案:

private function getrejects(){ 
// Here I just got joined data with duplicate emails and object_ids   
    global $DBC; 

    $qRecipients = pg_query($DBC,' 
     SELECT 
       users.email, objects.object_id, rejects.path, rejects.report_id 
     FROM 
       rejects      
     LEFT JOIN 
       objects 
     ON 
       rejects.object_id = objects.object_id       
     LEFT JOIN 
       users 
     ON 
       objects.user_id = users.user_id 
     WHERE 
       date_sent IS NULL 

    '); 

    $result = array(); 
    while($row = pg_fetch_assoc($qRecipients)){ 
     array_push($result,$row); 
    } 

    return $result; 

} 

,在這裏我把它與電子郵件的陣列和OBJECT_ID隨後的鑰匙。

private function formatemaildata($in){ 

    foreach ($in as $row){    
     if (!isset($result[$row['email']][$row['object_id']])){ 
      $result[$row['email']][$row['object_id']]=array(); 
     }    
     array_push($result[$row['email']][$row['object_id']], $row['path']); 
    } 
    return $result; 

} 

結果而傾倒是沿着

'[email protected]' => 
    array(3) { 
    [8573] => 
    array(4) { 
     [0] => 
     string(30) "http://lorempixel.com/400/200/" 
     [1] => 
     string(30) "http://lorempixel.com/400/200/" 
     [2] => 
     string(30) "http://lorempixel.com/400/200/" 
     [3] => 
     string(30) "http://lorempixel.com/400/200/" 
    } 
    [8574] => 
    array(4) { 
     [0] => 
     string(30) "http://lorempixel.com/400/200/" 
     [1] => 
     string(30) "http://lorempixel.com/400/200/" 
     [2] => 
     string(30) "http://lorempixel.com/400/200/" 
     [3] => 
     string(30) "http://lorempixel.com/400/200/" 
    }