2016-08-05 8 views
0

Ich habe eine Frage.Wie bekomme ich ein Array von DB

ich einen Tisch table1 wie diese haben:

ID | email | first_name | last_name 
1 | bla | bladibla | bladibladibla 

Und damit habe ich eine andere Tabelle table2:

ID | table1_id | name | value 
1 | 1   | foo | bar 
2 | 1   | foo1 | bar1 
3 | 1   | foo2 | bar2 

Meine Frage: Wie erhalte ich die Ergebnisse in PHP so?

$array = [ 
    id => 1, 
    email => bla, 
    first_name => bladibla, 
    last_name => bladibladibla, 
    data => [ 
     [ 
      name => foo, 
      value => bar 
     ], 
     [ 
      name => foo1, 
      value => bar1 
     ], 
     [ 
      name => foo2, 
      value => bar2 
     ], 
    ] 
] 

Meine Lösung, die für jetzt funktioniert, aber scheint nicht der beste Weg, es zu handhaben.


Ich habe das jetzt, aber es scheint nicht der richtige Weg, es zu tun, weil in der ersten foreach-Schleife, es ist eine Abfrage an die DB für jede Zeile in Tabelle 1 zu schießen.

$query = "SELECT * FROM `table1`"; 
$results = $wpdb->get_results($query); 

foreach($results as $result) { 
    $otherQuery = "SELECT * FROM `table2` WHERE `table1_id` = " . $result['id']; 
    $table2Results = $wpdb->get_results($otherQuery); 

    foreach($table2Results as $table2Result) { 
     // save all data in a new array just like I want it. 
    } 
} 
+0

Sie suchen nach einer [JOIN-Abfrage] (http://dev.mysql.com/doc/refman/5.7/en/join.html). In diesem Fall wäre eine linke Verknüpfung ausreichend. –

+0

@GeorgeCummins, ich bereits Ich habe versucht, eine Join-Abfrage, aber dann bekomme ich doppelte Werte aus Tabelle 1. – Refilon

+0

Sie erhalten Duplikate, weil Sie eine 'LINKE JOIN' anstelle von' INNER JOIN' versuchen. Versuchen Sie 'SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.table1_id'. – Anthony

Antwort

0
$query = "Select 
       t1.ID,t1.email,t1.first_name,t2.last_name,t2.name,t2.value 
      From 
       table1 t1 
      Inner Join 
       table2 t2 
      On t1.ID=t2.table1_id"; 

$results = $wpdb->get_results($query); 
$arr1=[]; 
$arr2=[]; 
foreach($results as $result) {  
    $arr1[]=['id'=>$result['ID'],'email'=>$result['email'], 
      'first_name'=>$result['first_name'], 
      'last_name'=>$result['last_name'],'data'=>[]];   
    $arr2[]=['name' => $result['name'],'value' => $result['value']]; 
} 

$arr1=array_unique($arr1); 
$arr1['data'][]=$arr2; 
+0

ok wird es aktualisieren – jonju

+1

Dann schlage ich vor, Sie haben Ihre Frage verbessert. Schau dir an, wie Leute deine Frage beantworten.Ich denke, sie haben die gleiche Idee wie ich – jonju

+0

Überprüfen Sie die bearbeitete Antwort – jonju

0

Versuchen Sie folgendes:

$query = "SELECT * FROM `table1`"; 
$results = $wpdb->get_results($query); 
$arr = []; // $arr = array(); 
foreach($results as $result) { 
    $temp = $result; 
    $otherQuery = "SELECT * FROM `table2` WHERE `table1_id` = " . $result['id']; 
    $table2Results = $wpdb->get_results($otherQuery); 

    foreach($table2Results as $table2Result) { 
     // save all data in a new array just like I want it. 
     $temp['data'][] = $table2Result 
    } 

    $arr[] = $temp; 
} 

print_($arr); 
+0

Sie können nicht erreicht, wie Sie von db wollen, in der Tat, wenn Sie zwei Tabellen verbinden werden Sie den doppelten Datensatz aus Tabelle1, deren ID mit Tabelle2 marschieren, –

+0

Sie können eine Sache tun, dass Sie das gesamte Objekt von table2 mit passender ID von table1 in der Tabelle1 mit json Objekt oder serialisieren Array-Objekt wie WordPress mit Meta-Tabelle –

0
$data = array(); 
$i = 0; 
foreach($results as $result) 
{ 
     $data[$i] = $result; 

     $otherQuery = "SELECT * FROM `table2` WHERE `table1_id` = " . $result['id']; 
     $table2Results = $wpdb->get_results($otherQuery); 

     $j = 0; 
     $data[$i]['data'] = array(); 
     foreach($table2Results as $table2Result) 
     { 
       $data[$i]['data'][$j] = $table2Result; 
       $j++; 
     } 
     $i++; 
} 
print_r($data); 
0

Sie sollten Duplikate werden immer in der JOIN, da Ihr Beispiel Array zeigt, dass jeder tabelle1 Datensatz mehr als eine table2 verwandt Aufzeichnung. Mehrere Abfragen zu vermeiden, wird das nicht verhindern. Was Sie wollen, ich denke, ist so etwas wie:

$query = "SELECT * FROM table1 LEFT JOIN table2 WHERE table1.id = table2.table1_id"; 
$results = $wpdb->get_results($query); 

foreach($results as $result) { 

    $table1_id = $result["table1.id"]; 

    $entries[$table1_id]['id'] = $table1_id; 
    $entries[$table1_id]['email'] = $result["table1.email"]; 
    $entries[$table1_id]['first_name'] = $result["table1.first_name"]; 
    $entries[$table1_id]['last_name'] = $result["table1.last_name"]; 

    $entries[$table1_id]['data'][] = array($result["table2.name"], $result["table2.value"]); 

} 

print_r($entries) // the full array of table1 entries with the sub-array of table2 entries per table1 entry. 

durch Eingabe jeden Array Eintritt in den table1.id, stellen Sie sicher, dass, selbst wenn sie wiederholt werden, die table2 Einträge als neue Einträge in das Datenfeld hinzukommen, während kein neuer Array-Eintrag für den "äußeren" table1-Hauptdatensatz erstellt wird.

Wenn Sie nicht über die table1.id Taste auf dem Array wollen selbst (und haben einen einfachen 0-basierten indiziertes Array, könnten Sie neu indizieren, nachdem Sie in der Schleife wie fertig sind:

$entries = array_values($entries); 
+0

speichern können Wirklich? Ich dachte, es sei die Pflicht erfahrener Benutzer, schlechtes Benehmen anderer Benutzer hervorzurufen. Ich dachte mir, "wie ein Schwuler zu sein" war der schönste und effizienteste Weg, um den Benutzer wissen zu lassen, dass sie mehreren Nutzern auf eine Art und Weise unerträglich unhöflich waren, dass sich ihre Bemühungen bedeutungslos anfühlten. Ich halte mich für ziemlich nett, und sagte, "ein bisschen wie ein Schwanz" zu sein, weniger Namensaufruf und eher eine Kritik des aktuellen Verhaltens von jemandem. Und ich bin mir sicher, dass Sie sich dessen bewusst geworden sind, weil er meinen Kommentar markiert hat, anstatt zuzugeben, dass er unhöflich war und dafür gerufen wurde – Anthony

+0

Und Sie können meinen gesamten Kommentarverlauf einsehen, um zu sehen, dass ich Freundlichkeit und Rücksicht immer befürwortet habe , sowie eine persönliche und snarky Stimme zu halten. Ich entschuldige mich dafür, dass er "ein bisschen wie ein Schwanz" war, als er sich bei den drei anderen Nutzern entschuldigt, die er im Grunde genommen als faul und ungebildet bezeichnete, als sie ihre Hilfe anboten. Ich denke, dass diese Art von Verhalten (zusammen mit Tattle Telling) für einen Benutzer mit einem 1k + Ruf völlig inakzeptabel ist. – Anthony

+0

Es ist okay, ich war impulsiv, als ich sagte, er sei ein Schwanz. Aber ich fühlte, dass ich es besitzen musste (da es schlechtes Benehmen gab und weil ich dachte, es würde nicht eskalieren). Ich bedenke, dass es schnell zu Lawinenunfällen kommen kann, wenn das Siegel gebrochen ist. – Anthony