2010-12-09 11 views
1

Tabelle 1 = Ereignisse Auswahl -> eine Liste der Ereignisse Tabelle 2 = Antwortphp mysql fortgeschrittene

hält -> hält eine Liste der Benutzer Antworten einen Fremdschlüssel von eid hat, die Tabelle mit Ereignissen

I entspricht müssen die Tabellen zusammenfügen, damit sie ein ähnliches Array auf php zurückgeben können.

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', 
      ) 
    ) 
) 
); 

kann dies getan werden? nur mit mysql? coz ich weiß, dass Sie es auf php tun können.

Antwort

2

Sie können alle erforderlichen Daten in MySQL mit einer einzelnen JOIN Abfrage sammeln.

PHP wird jedoch standardmäßig kein Array wie Ihr Beispiel zurückgeben. Sie müssten das Abfrageergebnis durchlaufen und ein solches Array selbst erstellen.

0

Genau wie Jason McCreary sagte. Für Sie Bequemlichkeit, hier ist die Abfrage, die Sie brauchen (obwohl die Feldnamen nicht Ihre db Struktur passend sein könnte, wie Sie diese Informationen nicht vorsah)

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

Ich bin mir ziemlich sicher, dass die Antwort ist nein, da mysql gibt immer eine "flache" Ergebnismenge zurück. So können Sie alle Ergebnisse erhalten Sie suchen mit:

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 

und dann in das Array mit PHP zu massieren, aber ich glaube, das ist, was Sie bereits tun.

EDIT:

By the way, wenn Sie für jedes Ereignis 1 Zeile möchten, können Sie GROUP_CONCAT verwenden:

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 Für die Verkettung, wie bei einem einfachen Ergebnis wie diesem, wäre es leicht, das resultierende Feld zu explodieren. (Angenommen, das Feld Vorname enthält das Trennzeichen nicht.) – Orbling

0

Die SQL ist:

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

Ich dachte, ich würde zeigen Ihnen, wie Sie die Ergebnisse wie gewünscht in das Array einmassieren:

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