2013-10-29 21 views
0
我解釋

好嗎最好的辦法是提供一個示例試圖組了一個SQL多表查詢的結果

Table 1 
ID | name  | class 
------------------------- 
1 | first name | a 
2 | second name | b 

Table 2 
ID | name_id | meta_key | meta_value    | 
------------------------------------------------------- 
1 | 1  | image  | someImage.jpg   | 
2 | 1  | description | very long description | 
3 | 2  | image  | someImage_2.jpg   | 
4 | 2  | description | very long description 2 | 

我試圖從表1中選擇名稱和類,以及所有記錄從表2可以看出與ID(表1)相同的name_id

下面是該查詢我現在有:

SELECT 
    table1.name, 
    table1.class, 
    table2.name_id, 
    table2.meta_key, 
    table2.meta_value      
FROM 
    table1 
LEFT JOIN 
    table2 ON (table1.ID = table2.name_id)   
WHERE 
    table1.ID = '2' 

這工作,並返回與儘可能多元素的數組的表已經名_ID = 2

2項有沒有辦法返回一個數組1中第一個表的結果,另一個數組中第二個表的結果?

更新: 理想的結果將是: $導致[ '表1'] [0] =陣列( '姓名'=> '第二名', '類'=> 'B')

$result['table2'][0] = array('name_id' => 2, 
          'meta_key' => 'image', 
          'meta_value' => 'someImage_2.jpg') 
$result['table2'][1] = array('name_id' => 2, 
          'meta_key' => 'description', 
          'meta_value' => 'very long description 2') 

希望是有道理的。

+0

那麼,這只是一個SQL語句。如果你想'數組',那麼你正在尋找PHP代碼。我敢打賭,這將是更好的拆分數組,而不是創建2個單獨的查詢 –

+0

我問的是如果有一種SQL方式或將返回一個數組,具有我所需要的查詢。我知道我可以把目前的結果,並作出一個新的陣列,將符合我在找什麼。 –

+0

你試圖得到什麼輸出?你可以製作一個模型嗎? – Mazzy

回答

0

我的結果數組拆分後從數據庫中獲取它...

//Assuming your result-set is assigned to $result: 

$table1_keys = array('id', 'name', 'class'); 
$table2_keys = array('id', 'name_id', 'meta_key', 'meta_value'); 

$table1_results = array(); 
$table2_results = array(); 

foreach($result as $key => $val) { 
    if(in_array($key, $table1_keys)) { 
     $table1_results[] = $val; 
    } 

    if(in_array($key, $table2_keys)) { 
     $table2_results[] = $val; 
    } 
} 

在此之後,你的結果集應分成兩個數組:$table1_results$table2_results

希望這可以幫助你。

0

我不認爲有一種方法可以在SQL中完成,但我會爲每張表添加標籤,以便它可以在PHP中完成。

SELECT 
    ':table1', 
    table1.name, 
    table1.class, 
    ':table2', 
    table2.name_id, 
    table2.meta_key, 
    table2.meta_value 
FROM ... 

雖然個人我只是這樣做。

SELECT 'table1', table1.*, ':table2', table2.* 
FROM ... 

這樣可以更輕鬆地在客戶端和服務器之間複製整行,並在決定添加新字段時減少維護。

但是在您的查詢中,您爲每個返回的行復制table1,所以這可能會更好。

SELECT 
    table1.*, 
    table2a.meta_value AS image, 
    table2b.meta_value AS description 
FROM 
    table1 
LEFT JOIN 
    table2 AS table2a ON (table1.ID = table2a.name_id AND table2a.meta_key = 'image') 
LEFT JOIN 
    table2 AS table2b ON (table1.ID = table2b.name_id AND table2b.meta_key = 'description') 
WHERE 
    table1.ID = '2'