Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Abfrage pro Id in eine Zeile zusammenführen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL Abfrage pro Id in eine Zeile zusammenführen

    Hallo
    Ich schlage mich nun schon seit Stunden mit diesem Problem herum. Google hat einige Ansätze gefunden, aber bei mir hat nichts gefruchtet. Ich hoffe Ihr könnt mir helfen.
    Zu meiner Situation:
    Ich verwende in Wordpress ein Plugin, dass Eventdaten, u.a. den Ort in Lat/Lng, in sog. MetaDaten speichert. Das Problem an den Metadaten ist, dass diese für jede Seite in Schlüssel und Wert aufgeteilt sind. Ich bekomme nun mit einer SQL Abfrage viele Zeilen mit den ganzen Daten. Selbst wenn ich nur auf die benötigen beiden Schlüssel einschränke, weiß ich nicht, wie ich diese der ID zuordnen kann.
    Denn es geht noch weiter. Ich möchte diese Daten in ein XML-File schreiben, damit ich die Koordinaten in einer GoogleMaps Tabelle darstellen kann.

    Hier mal ein Codeausschnitt:
    PHP-Code:
    $query "SELECT  post_id, meta_key, meta_value FROM " $wpdb->prefix "postmeta WHERE meta_key = '_EventLat' OR meta_key = '_EventLng' ORDER BY post_id";
    $result mysql_query($query);
    if (!
    $result) {
      die(
    'Invalid query: ' mysql_error());
    }

    header("Content-type: text/xml");
    while (
    $row = @mysql_fetch_assoc($result)) {
      
    // ADD TO XML DOCUMENT NODE
        
    $node $dom->createElement("marker");  
        
    $newnode $parnode->appendChild($node);
        
    $newnode->setAttribute("id"$row['post_id']);
         
    // if ($row['meta_key'] === '_EventLat')
            
    $newnode->setAttribute("key"$row['meta_key']);
         
    // if ($row['meta_key'] === '_EventLng')
            
    $newnode->setAttribute("value"$row['meta_value']);
      } 
    ---> XML-File Ausschnitt:
    PHP-Code:
    <marker id="100" key="_EventLng" value="11.077069599999959"/>
    <
    marker id="100" key="_EventLat" value="49.455169"/> 
    Ich brächte aber folgende Zeile im XML-File:
    PHP-Code:
    <marker id="100" lat="11.077069599999959" lng="49.455169"/> 
    Pro ID sollte nur eine Zeile im XML-File dargestellt werden.

    Irgendwie sehe ich grad keinen Ausweg. Ich hoffe ihr könnt mir dabei helfen.

    Vielen Dank.

  • #2
    Hallo martin.b07,

    spontan fallen mir drei Ansätze zum Lösen deines Problems ein:
    1. Du erstellst in der schon vorhandenen while-Schleife anstatt der XML-Knoten zunächst eine temporäre PHP-Struktur, welche du in einer zweiten Schleife in XML-Knoten umwandelst. Eine solche temporäre Struktur könnte etwa so aussehen:
    PHP-Code:
    $marker[$id] = array("_EventLng" => ..., "_EventLat" => ...) 
    Und in deiner while-Schleife etwa so erzeugt werden:
    PHP-Code:
    $marker[$row['post_id']][$row['meta_key']] = $row['meta_value'
    2. Du überprüfst vor Erzeugung eines Knotens, ob schon ein Knoten mit der aktuellen ID existiert, und modifizierst diesen gegebenenfalls. Stichworte dazu: DOMDocument::getElementById und DOMElement::setIdAttribute.

    3. Du erzeugst mithilfe eines Self-Joins direkt in der SQL-Anweisung die benötigte Struktur.

    Viele Grüße
    smon

    Kommentar


    • #3
      Hi smon

      Danke für deine Ideen.
      Was wäre den deiner Meinung die beste und sagen wir pefomantere?

      Ich werde einfach mal die einzelnen Möglichkeiten probieren.

      cheers
      martin

      Kommentar


      • #4
        Irgendwie war heute nicht mein Tag. Habe mich mit deinen Ideen leider immer tiefer in Wald getrieben.
        Aber ich habe mir jetzt ne eigene Lösung gebastelt.
        Auf einer Google Maps API Seite zum Thema habe ich eine PHP-Echo Anleitung gefunden.
        Dann habe ich noch ein paar If-Abfragen reingebastelt und schon geht es.

        PHP-Code:
        // Iterate through the rows, printing XML nodes for each
        while ($row = @mysql_fetch_assoc($result)){
            
          if(
        $check != $row['post_id']) {
            if(
        $check)
              echo 
        '</marker>';
              
            
        // ADD TO XML DOCUMENT NODE
            
        echo '<marker ';
            echo 
        'id="' parseToXML($row['post_id']) . '">';
            echo 
        '<' parseToXML($row['meta_key']) . '>';
            echo 
        parseToXML($row['meta_value']);
            echo 
        '</' parseToXML($row['meta_key']) . '>';
          }
          else {
            echo 
        '<' parseToXML($row['meta_key']) . '>';
            echo 
        parseToXML($row['meta_value']);
            echo 
        '</' parseToXML($row['meta_key']) . '>';
          }

          
        $check $row['post_id'];
          
        }
        echo 
        '</marker>'
        Ausgabe
        PHP-Code:
        <marker id="95"><EventAllDay>yes</EventAllDay><EventShowMapLink>false</EventShowMapLink><EventStartDate>2011-08-26 00:00:00</EventStartDate><EventEndDate>2011-08-28 23:59:00</EventEndDate><EventVenue>Speicherteich Gerstreit Saalbach Hinterglemm</EventVenue><EventCountry>Austria</EventCountry><EventAddress>Speicherteich9805Austria</EventAddress><EventCity>Hinterglemm</EventCity><EventState/><EventProvince/><EventZip>5754 </EventZip><EventShowMap>true</EventShowMap><EventLat>13.454783200000065</EventLat><EventLng>46.7710544</EventLng></marker
        Trotzdem danke. Mit deinem zweiten Tipp bin ich meine Finalle Lösung gekommen.

        cheers
        Martin

        Kommentar

        Lädt...
        X