2010-12-09 16 views
1

tableau 1 = événements -> contient une liste des événementsphp mysql avancé en sélectionnant

tableau 2 = réponse -> détient une liste de réponses des utilisateurs a une clé étrangère de l'Aïd qui correspond à des événements tableau

I besoin de rejoindre les tables ensemble afin qu'il puisse retourner un tableau similaire à ceci sur 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', 
      ) 
    ) 
) 
); 

cela peut-il être fait? using mysql seulement? coz je sais que vous pouvez le faire sur php.

Répondre

2

Vous pouvez rassembler toutes les données nécessaires dans MySQL avec une seule requête JOIN. Cependant, PHP ne retournera pas un tableau comme votre exemple par défaut. Vous devrez faire une boucle sur l'ensemble de résultats de la requête et créer vous-même un tel tableau.

0

Juste comme Jason McCreary a dit. Pour vous commodité, voici la question que vous avez besoin (bien que les noms de champs peuvent ne pas être correspondant à votre structure db, comme vous ne l'avez pas fourni ces informations)

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

Je suis sûr que la réponse est non, puisque MySQL renvoie toujours un jeu de résultats "plat". Ainsi, vous pouvez obtenir tous les résultats que vous recherchez à l'aide:

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 

Et puis masser dans le tableau avec php, mais j'imagine que c'est ce que vous faites déjà.

EDIT:

Par ailleurs, si vous voulez 1 ligne pour chaque événement, vous pouvez utiliser 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 Pour la concaténation, comme avec un résultat simple comme celui-ci, il serait facile d'exploser le champ résultant. (En supposant que le champ prénom ne contient pas le délimiteur.) – Orbling

0

Le SQL est:

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

je pensais vous montrer comment masser les résultats dans le tableau comme vous le souhaitiez:

$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);