komplexe Anfrage

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

  • komplexe Anfrage

    Hallo Zusammen, ich hab mir mal eine etwa komplexer Anfrage (für meine Verhältnise) gebastelt und wollte diese nocheinmal erweiter, weis nun aber nicht wie.

    Hier erst mal die Anfrage
    Code:
    SELECT ep1.subject, ep1.object, ep2.object, ep3.object, ep4.object, el.name
    		FROM element_property AS ep1, element_property AS ep2, element_property AS ep3, 
    			 element_property AS ep4, element AS el
    		WHERE ep1.predicate =800416
    		AND ep1.subject = ep2.subject
    		AND ep2.predicate =800418
    		AND ep1.subject = ep3.subject
    		AND ep3.predicate =800420
    		AND ep1.subject = ep4.subject
    		AND ep4.predicate =800422
    		AND ep1.subject = el.id
    		GROUP BY ep1.subject
    Hinter den predicate = 8004xx verbergen sich Adressen um genauer zu sein, Straße, Hausnummer, Postleitzahl und Stadt. Ich suche also mit dieser Anfrage die letzte eingetragene Adresse aus der Datenbank.
    Nun gibt es eine Weitere Tabelle element_adds in der Koordinaten (GPS) zu Adressen gespeichert sind. Diese besteht aus den Feldern id (entspricht dem Subject oben),
    attribute (muss in diesem Fall GeoPosition lauten)
    value (enthält die GeoPosition, also die Koordinaten).

    Die obige Abfrage würde ich nun gerne erweitern so das nur Adressen angezeigt werden die noch keine Koordinaten enthalten.

    D.h. ich müsste wohl die FROM Klausel um
    Code:
    , element_adds_ AS ea
    erweitern und in der WHER Klause sollte wohl
    Code:
    ea.attribute='GeoPosition' AND ep1.subject = ea.id
    drin stehen.
    Erweitere ich die Anfrage so erhalte ich alle Adressen zu dennen schon Koordinaten eingetragen sind aber nicht solche zu dennen sie nicht eingetragen sind. Ein weiteres Problem ist noch das zu machen Adressen andere "adds" (also nicht attribute=GeoPosion, sondern andere Attribute) gespeichert sind.

    Schon mal vielen Dank für eure mühen.
    Wissen ist Macht
    Power is nothing without control

  • #2
    Adressen zu denen es noch keine Koordinaten gibt (d.h. keine Entsprechung in einer anderen Tabelle) findet man mit LEFT JOIN andere Tabelle. siehe mysql Manual und einige threads in diesem Forum.

    Kommentar


    • #3
      Ok, die ON Klausel wars...
      Code:
      SELECT ep1.subject, ep1.object, ep2.object, ep3.object, ep4.object, el.name, ea.value
      		FROM element_property AS ep1, element_property AS ep2, element_property AS ep3, 
      			 element_property AS ep4, 
      			 element AS el LEFT JOIN element_adds AS ea 
      			 ON (ep1.subject = ea.id AND ea.attribute='GeoPosition')
      		WHERE ep1.predicate =800416
      		AND ep1.subject = ep2.subject
      		AND ep2.predicate =800418
      		AND ep1.subject = ep3.subject
      		AND ep3.predicate =800420
      		AND ep1.subject = ep4.subject
      		AND ep4.predicate =800422
      		AND ep1.subject = el.id
      		GROUP BY ep1.subject
      Ein Blick http://www.php-resource.de/forum/sho...threadid=28292
      hierhin hat geholfen, sorry das ich es nicht gleich gesehen hab.
      Wissen ist Macht
      Power is nothing without control

      Kommentar


      • #4
        Und nach einem zweiten Blick auf den Beitrag "JOINS - das leidige Thema". Hab ich dann mal noch USING eingebaut.

        Code:
        SELECT ep1.subject, ep1.object, ep2.object, ep3.object, ep4.object, el.name, ea.value
        		FROM element_property AS ep1 
        			 INNER JOIN element_property AS ep2 
        			 INNER JOIN element_property AS ep3 
        			 INNER JOIN element_property AS ep4 USING (subject)
        			 LEFT JOIN element as el ON (el.id = ep1.subject) 			 
        			 LEFT JOIN element_adds AS ea 
        			 ON (ep1.subject = ea.id AND ea.attribute='GeoPosition')
        		WHERE ep1.predicate =800416
        		AND ep1.subject = ep2.subject
        		AND ep2.predicate =800418
        		AND ep1.subject = ep3.subject
        		AND ep3.predicate =800420
        		AND ep1.subject = ep4.subject
        		AND ep4.predicate =800422
        		AND ep1.subject = el.id
        		GROUP BY ep1.subject
        Wissen ist Macht
        Power is nothing without control

        Kommentar


        • #5
          1)du hast bei den ersten JOINs "ON" vergessen
          2) verzichte für alle fälle auf using und mach mit besser alles mit ON
          3) verschiebe die Bedingung aus where in "ON " rein, sonnst gibt es meist Probleme mit Left joins
          Slava
          bituniverse.com

          Kommentar


          • #6
            1)du hast bei den ersten JOINs "ON" vergessen
            Ich dachte die USING Klause würde sich auf alle JOINs beziehen die davor stehen. Das es so funktioniert ist also nur Zufall? Das Using bzw. ON muss hinter jedem JOIN stehen?

            2) verzichte für alle fälle auf using und mach mit besser alles mit ON
            Ich dachte ON und USING seinen ansich das Selbe, nur das man mit ON auch Tabellen überverschiedene Feldnamen verknüpfen kann. Hab ich da etwas falsch verstanden? Was ist der wirkliche unterschied zwischen USING und ON?

            3) verschiebe die Bedingung aus where in "ON " rein, sonnst gibt es meist Probleme mit Left joins
            ups, 'AND ep1.subject = el.id' in der WHERE Klausel hab ich einfach vergessen zu löschen in der ON Klausel steht es ja schon drin.
            Wissen ist Macht
            Power is nothing without control

            Kommentar


            • #7
              Original geschrieben von Mr.Programe
              Ich dachte ON und USING seinen ansich das Selbe, nur das man mit ON auch Tabellen überverschiedene Feldnamen verknüpfen kann.
              ON geht für beliebige Bedingungen, auch mit Funktionen. ON ist lesbarer, sogar wenn es die gleichen Feldnamen sind. ON ist robuster bei Feldnamen-Aenderungen. ON liest sich wie WHERE.

              Kommentar


              • #8
                ok, dann sieht das ganze so aus
                Code:
                SELECT ep1.subject, ep1.object, ep2.object, ep3.object, ep4.object, el.name, ea.value
                		FROM element_property AS ep1 
                			 INNER JOIN element_property AS ep2 ON ep1.subject=ep2.subject
                			 INNER JOIN element_property AS ep3 ON ep1.subject=ep3.subject
                			 INNER JOIN element_property AS ep4 ON ep1.subject=ep4.subject
                			 LEFT JOIN element as el ON ep1.subject = el.id			 
                			 LEFT JOIN element_adds AS ea ON (ep1.subject = ea.id AND ea.attribute='GeoPosition')
                		WHERE ep1.predicate =800416
                		AND ep1.subject = ep2.subject
                		AND ep2.predicate =800418
                		AND ep1.subject = ep3.subject
                		AND ep3.predicate =800420
                		AND ep1.subject = ep4.subject
                		AND ep4.predicate =800422
                		GROUP BY ep1.subject
                Zuletzt geändert von Mr.Programe; 01.07.2006, 15:05.
                Wissen ist Macht
                Power is nothing without control

                Kommentar

                Lädt...
                X