2017-01-01 3 views
-1

Ich habe derzeit 2 Tabellen keine Beziehungen zwischen den beiden etabliert. Ich möchte nur die Daten aus der 2. Tabelle an das Ende der 1. Tabelle in der JSON-Ausgabe anhängen.Wie verbinden Sie die Daten aus 2 Tabellen ohne Beziehungen in PHP?

1. Tabelle:

map_type  map_value 
----------------------------- 
image_link www.google.com 
top_lat  32.91 
right_long -117.13 
zoom_level 17.5 

2. Tabelle:

marker_name marker_lat marker_long 
------------------------------------------ 
Food   32.91  -117.14  
Party  31.22  -119.20 
Chips  29.02  -120.00 

ich die grundlegende Abfrage verstehen 2 Tabellen zu verknüpfen, und umgesetzt mit dem folgenden Code:

$sql = "select * from second_table join first_table"; 

$q = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection)); 

//create an array 
$jsonData = array(); 

while($row = mysqli_fetch_assoc($q)) 
{ 
    $jsonData[$row['map_type']] = $row['map_value']; 

    // Issue is here 
    if (!isset($jsonData['markers'])) 
    { 
     $jsonData['markers'] = array(); 

    } 
    array_push($jsonData['markers'], 
       array('marker_name'=> $row['marker_name'], 
        'marker_lat'=> $row['marker_lat'], 'marker_long'=> $row['marker_long'])); 

} 

echo json_encode($jsonData); 

Als solche Ich erhalte folgende Ausgabe:

{ 
    "image_link": "www.google.com", 
    "markers": [{ 
     "marker_name": "Food", 
     "marker_lat": "32.91", 
     "marker_long": "-117.14" 
    }, { 
     "marker_name": "Food", 
     "marker_lat": "32.91", 
     "marker_long": "-117.14" 
    }, 
    ... 
    }], 
    "top_lat": "32.91", 
    "right_long": "-117.13", 
    "zoom_level": "17.5" 
} 

Die einzigen Daten aus der zweiten Tabelle sind die in markers enthaltenen Daten, während die anderen Felddaten aus der ersten Tabelle stammen.

Das Problem ist in dem Kommentar mit der Bezeichnung "Problem ist hier". Jeder Markierungseintrag in der zweiten Tabelle wird wiederholt 4 mal, wobei die Anzahl der Felder in der ersten Tabelle darstellt.

Ich weiß, dass ich in diesem Bereich etwas falsch mache, aber ich habe gerade angefangen zu lernen und versuche, PHP besser zu verstehen.

Die Ausgabe sollte wie folgt aussehen etwas, wo markers bis zum Ende der Liste angehängt ist, mit der richtigen Anzahl der Einträge:

{ 
    "image_link": "www.google.com", 
    "top_lat": "32.91", 
    "right_long": "-117.13", 
    "zoom_level": "17.5", 
    "markers": [{ 
     "marker_name": "Food", 
     "marker_lat": "32.91", 
     "marker_long": "-117.14" 
    }, { 
     "marker_name": "Party", 
     "marker_lat": "31.22", 
     "marker_long": "-119.20" 
    }, { 
     "marker_name": "Chips", 
     "marker_lat": "29.02", 
     "marker_long": "-120.00" 
    }] 
} 

Wie kann ich diese Ausgabe erreichen?

UPDATE: als @sepehr erklärt hat, verstehe ich die Sache jetzt und haben den Code durch den folgenden ersetzt 2 Abfragen zu machen:

$sql = "select * from first_table"; 
$result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection)); 

$jsonData = array(); 

while($row =mysqli_fetch_assoc($result)) 
{ 
    $jsonData[$row['map_type']] = $value; 
} 

$sql = "select * from second_table"; 
$result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection)); 

$index = 1; 

while($rownew =mysqli_fetch_assoc($result)) 
{ 
    $markers[$index] = array("marker_name" => $rownew['marker_name'], "marker_lat" => doubleval($rownew['marker_lat']), "marker_long" => doubleval($rownew['marker_long'])); 

    ++$index; 
} 

$jsonData['markers'] = $markers; 
echo json_encode ($jsonData); 

Dies erreicht die korrekte Ausgabe, aber kann mir jemand lassen wissen, ob dies der effizienteste und optimale Weg ist?

+0

Warum willst du das tun ?? Die Position des Array-Schlüssels beherrscht PHP nicht. – HoangHieu

+0

versuchen Sie einfach, '//zu setzen Problem ist hier if (! Isset ($ jsonData ['marker'])) { $ jsonData ['marker'] = array(); } array_push ($ jsonData [ 'Marker'], array ('marker_name' => $ row [ 'marker_name'], 'marker_lat' => $ row [ 'marker_lat'], 'marker_long' => $ row ['marker_long'])); } 'insisde die' if (! Isset ($ jsonData ['marker'])) ' –

+0

Das' JOIN' macht keinen Sinn. Sie benötigen eine ON-Klausel oder Sie erhalten ein Cross-Produkt. – tadman

Antwort

1

Diese Duplikate sind wegen dieser Erklärung JOIN. Es wird doppelte Zeilen erzeugen. Have a look für dich selbst.

duplicate records

Um dieses JSON-Objekt zu bauen, empfehle ich Ihnen für diese Tabellen zwei getrennte Abfragen ausführen. Da sie keine logische Beziehung zueinander haben.

Oder wenn Sie dies in einer Abfrage, die ich nicht empfehlen, use a UNION like this MUSS, um diese doppelten Datensätze zu vermeiden.

+0

danke für die Illustration und Erklärung, ich aktualisierte meinen Code mit neuen Implementierung mit 2 Abfragen und es produziert die richtige Ausgabe ... aber ich mag es zu fragen, wenn Sie sehen können, ob es optimal und effizient? – Pangu

+0

Nein, es ist nicht der effizienteste Weg, dies zu tun. Sie haben zwei geschachtelte 'while's in Ihrem aktualisierten Code. Dies bedeutet, dass Sie für jeden Datensatz in der ersten Ergebnismenge die zweite Tabelle nach allen Datensätzen abfragen. Wenn die erste Tabelle beispielsweise 4 Datensätze enthält, führen Sie 5 Abfragen aus und überschreiben das Array "$ markers" immer wieder. Der effizienteste Weg, dies zu tun, besteht darin, zwei getrennte Abfragen/Schleifen zu verwenden, eine für die erste Tabelle und eine für die zweite Tabelle. Dann fügen Sie einfach das Array '$ markers' in die erste Ergebnismenge ein. – sepehr

+0

folgte Ihrem Vorschlag und aktualisiert, können Sie dies jetzt überprüfen? – Pangu

0

Die Ergebnisse aus den 2 Tabellen separat abrufen und mit der Funktion array_merge zusammenführen.

$maps = array(); //get the result from table 1 
$markers = array(); //get the result from table 2 

$result = array_merge($maps,$markers); 

echo json_encode($result); 
Verwandte Themen