2010-12-09 95 views
1

表1 =事件 - >持有事件的列表PHP的MySQL先進選擇

表2 =響應 - >保持的用戶的響應的列表具有EID的一個外鍵,其與事件表

I對應需要將表連接在一起,以便它可以在php上返回類似於此的數組。

array(
    0 => array(
     'title' =>'',      //title of events table 
     'contents' =>'this is a demo',  //contents of events table 
     'users' => array(     //users comes from response table 
      0 = array(
      'firstname'=>'John', 
      ), 
      1 = array(
      'firstname'=>'James', 
      ) 
    ) 
) 
); 

可以這樣做嗎?只使用mysql?因爲我知道你可以在PHP上做到這一點。

回答

2

您可以通過單個JOIN查詢收集MySQL中的所有必要數據。

但是,默認情況下,PHP不會像你的例子那樣返回一個數組。你將不得不遍歷查詢結果集並自己創建這樣一個數組。

0

就像Jason McCreary說的那樣。爲了方便你,這裏是你需要(儘管字段名稱可能不會匹配您的數據庫結構,因爲你沒有提供此信息)查詢

SELECT 
    * 
FROM 
    events 
LEFT JOIN 
    responses ON (events.id = responses.eid) 
1

我敢肯定的答案是否定的,因爲MySQL的總是返回一個「平坦」結果集。所以,你可以得到所有你正在尋找使用效果:

SELECT e.title, e.contents, r.firstname 
FROM events e LEFT JOIN response r ON e.id = r.eid 
ORDER BY e.id, r.id 

然後它按摩與PHP中的數組,但我想這是你在做什麼了。

編輯:

順便說一句,如果你想1行的每個事件,您可以使用GROUP_CONCAT

SELECT e.title, e.contents, GROUP_CONCAT(DISTINCT r.firstname ORDER BY r.firstname SEPARATOR ',') as users 
FROM events e LEFT JOIN response r ON e.id = r.eid 
GROUP BY e.id 
+0

+1對於連接,就像這樣一個簡單的結果,它將很容易爆炸結果字段。 (假設名字字段不包含分隔符。) – Orbling 2010-12-09 13:48:59

0

的SQL是:

SELECT events.id, events.title, events.contents, 
     response.id AS rid, response.firstname 
FROM events LEFT JOIN response 
    ON events.id = response.eid 

我想我會告訴你如何按照你的意願按摩結果到陣列中:

$query = "SELECT events.id, events.title, events.contents, response.id AS rid, response.firstname 
      FROM events LEFT JOIN response ON events.id = response.eid"; 

$result = mysql_query($query); 

$events = array(); 
while ($record = mysql_fetch_assoc($result)) { 
    if (!array_key_exists($record['id'], $events)) { 
    $events[$record['id']] = array('title' => $record['title'], 'contents' => $record['contents'], 'users' => array()); 
    } 

    if ($record['rid'] !== NULL) { 
    $events[$record['id']]['users'][$record['rid']] = array('firstname' => $record['firstname']); 
    } 
} 

mysql_free_result($result);