Sinabell: Multipler Output von SQL-Datensätzen

Hallo zusammen!

Ich hänge nun schon ziemlich lange an einem Problem, welches ich schonmal hatte und nach langem suchen auch gelöst hatte. Leider kann ich mich beim besten Willen nicht mehr an die Lösung erinnern.

Ich habe folgende SQL-Abfrage:

  
		SELECT  
			t1.id AS pc_id,  
			t1.requester AS pc_requester,  
			t1.serial AS pc_serial,  
			t1.anlagennr AS pc_anlagennr,  
			t1.dose AS pc_dose,  
			t3.ort AS standort_ort  
		FROM  
			tbl_pc AS t1  
		LEFT JOIN  
			tbl_netzwerk AS t2 ON t2.standort = t1.dose  
		LEFT JOIN  
			tbl_standort AS t3 ON t3.id = t2.standort  
		WHERE  
			t1.requester LIKE '%".$_POST['requester']."%'  
		AND  
			t1.serial LIKE '%".$_POST['serial']."%'  
		AND  
			t1.anlagennr LIKE '%".$_POST['anlagennr']."%'  
		AND  
			t1.skartiert = '0'  
		AND  
			t1.kostenstelle >= '".$ks_min."'  
		AND  
			t1.kostenstelle <= '".$ks_max."'  
		AND  
			t1.aktiv = '1'  
		ORDER BY  
			t1.requester ASC  

Es werden auch alle Datensätze richtig ausgegeben...nur leider jeder Datensatz exakt 6x in Folge!

Wie kann ich dies lösen?

Danke im Vorhinein.

Gruß
Daniel

  1. Hi,

    SELECT DISTINCT
    oder
    GROUP BY

    ~dave

    1. moin,

      SELECT DISTINCT
      oder
      GROUP BY

      beides keine guten wege, besser nicht die OUTER JOINS einsetzen (wie immermein Leitspruch graits dazu: Joins sind böse), sondern korrelierte Unterabfragen benutzen. dann passt es auch mit der anzahl der datensätze.

      Ilja

    2. Hi,

      SELECT DISTINCT
      oder
      GROUP BY

      ~dave

      DISTINCT war die Lösung.
      Vielen Dank für die Hilfe! :-)

      Gruß
      Daniel

  2. Hi!

      FROM  
      	tbl\_pc AS t1  
      LEFT JOIN  
      	tbl\_netzwerk AS t2 ON t2.standort = t1.dose  
      LEFT JOIN  
      	tbl\_standort AS t3 ON t3.id = t2.standort  
    

    Es werden auch alle Datensätze richtig ausgegeben...nur leider jeder Datensatz exakt 6x in Folge!

    Du hast drei Tabellen, die du miteinander verknüpfst. Von t2 willst du gar keine Daten haben. Du verknüpfst über t1.dose = t2.standort = t3.id. Warum lässt du nicht den Standort weg, wenn sich letztlich t1.dose = t3.id ergibt? Dass du mehrfache Ergebnisse bekommst, liegt wohl an den Daten. Zu den jeweiligen t1.dose lassen sich vermutlich 6 t2.standorte finden. t3.id wird es nur einmal geben, sonst wäre auch 2 t2 mal 3 t3 oder 3 t2 mal 2 t3 möglich.

    Lo!

    1. Hi!

        FROM  
        	tbl\_pc AS t1  
        LEFT JOIN  
        	tbl\_netzwerk AS t2 ON t2.standort = t1.dose  
        LEFT JOIN  
        	tbl\_standort AS t3 ON t3.id = t2.standort  
      

      Es werden auch alle Datensätze richtig ausgegeben...nur leider jeder Datensatz exakt 6x in Folge!

      Du hast drei Tabellen, die du miteinander verknüpfst. Von t2 willst du gar keine Daten haben. Du verknüpfst über t1.dose = t2.standort = t3.id. Warum lässt du nicht den Standort weg, wenn sich letztlich t1.dose = t3.id ergibt? Dass du mehrfache Ergebnisse bekommst, liegt wohl an den Daten. Zu den jeweiligen t1.dose lassen sich vermutlich 6 t2.standorte finden. t3.id wird es nur einmal geben, sonst wäre auch 2 t2 mal 3 t3 oder 3 t2 mal 2 t3 möglich.

      Lo!

      Hallo!

      Diese Abfrage nutzt lediglich einen Teil der Tabellen, welche einen Datenpool für mehrere PHP-Module darstellen. Der Umweg über tbl_netzwerk ist gewollt und muss so fungieren. ;-)

      Verstehe, weil also mehrere Ergebnisse durch das LEFT JOIN gefunden werden, gibt SQL den Datensatz auch mehrfach zurück. Gut, ich werde erstmal DISTINCT einsetzen, da es das Problem behebt, da das Modul benötigt wird. Werde aber noch sehen ob ich die Abfrage brauchbar verbessern kann. Vielen Dank.

      Gruß
      Daniel

      1. Hi!

        Bitte zitiere in der hier üblichen Weise und nicht Full-Qoute mit Text drunter. Danke.

        Verstehe, weil also mehrere Ergebnisse durch das LEFT JOIN gefunden werden, gibt SQL den Datensatz auch mehrfach zurück.

        Naja, wenn du bei einem Join wird immer das kartesische Produkt gebildet, also alle Datensätze von links werden mit denen von rechts multipliziert.

        Gut, ich werde erstmal DISTINCT einsetzen, da es das Problem behebt, da das Modul benötigt wird.

        Warum auch immer deine Datenstruktur so aufgebaut ist, dass bei dieser Abfrage mehrere Datensätze in der anderen Tabelle gefunden werden, DISTINCT ist nicht die beste Lösung. Denn dieses nimmt sich irgendeinen Datensatz. Das Ergebnis aus der dritten Tabelle ist damit ein zufälliges. Wenn das aufgrund deiner Daten doch stets das selbe ergibt, dann machst du was verkehrt. Um da was konkret besseres vorschlagen zu können, müsste man Bedeutung der Felder und ihre Zusammenhänge kennen.

        Werde aber noch sehen ob ich die Abfrage brauchbar verbessern kann.

        Auch das von Ilja vorgeschlagene Subselect sehe ich nicht unbedingt als die Lösung (des vermuteten strukturellen Problems) an. Mit diesem kannst du jedoch zumindest genauer als mit dem DISTINCT spezifizieren, welchen der 6 Datensätze es liefern soll (WHERE, ORDER BY, LIMIT wären die einschränkenden Kandidaten).

        Lo!

        1. Bitte zitiere in der hier üblichen Weise und nicht Full-Qoute mit Text drunter. Danke.

          Entschuldige bitte. In anderen Foren ist es meist unhöflich Beiträge des anderen zu "zerlegen", darum tue ich das normal nicht.
          Aber ich werde versuchen, mich hier anzupassen.

          Warum auch immer deine Datenstruktur so aufgebaut ist, dass bei dieser Abfrage mehrere Datensätze in der anderen Tabelle gefunden werden, DISTINCT ist nicht die beste Lösung. Denn dieses nimmt sich irgendeinen Datensatz. Das Ergebnis aus der dritten Tabelle ist damit ein zufälliges. Wenn das aufgrund deiner Daten doch stets das selbe ergibt, dann machst du was verkehrt. Um da was konkret besseres vorschlagen zu können, müsste man Bedeutung der Felder und ihre Zusammenhänge kennen.

          Gerade habe ich einen elendslangen Beitrag geschrieben um die Tabellenfelder, die Zusammnhänge etc. zu erklären. Und während ich das aufgeschrieben und rekonstruiert habe, fiel mir auf, dass

          tbl_netzwerk AS t2 ON t2.standort = t1.dose

          eigentlich

          tbl_netzwerk AS t2 ON t2.dose = t1.dose

          lauten sollte.
          Also wieder mal ein reiner Dummheitsfehler. Sorry.

          Danke für die Hilfe aller Beteiligten!

          Gruß
          Daniel

  3. Hello,

    Ich habe folgende SQL-Abfrage:

      SELECT  
      	t1.id AS pc_id,  
      	t1.requester AS pc_requester,  
      	t1.serial AS pc_serial,  
      	t1.anlagennr AS pc_anlagennr,  
      	t1.dose AS pc_dose,  
      	t3.ort AS standort_ort  
      FROM  
      	tbl_pc AS t1  
      LEFT JOIN  
      	tbl_netzwerk AS t2 ON t2.standort = t1.dose  
      LEFT JOIN  
      	tbl_standort AS t3 ON t3.id = t2.standort  
      WHERE  
      	t1.requester LIKE '%".$_POST['requester']."%'  
      AND  
      	t1.serial LIKE '%".$_POST['serial']."%'  
      AND  
      	t1.anlagennr LIKE '%".$_POST['anlagennr']."%'  
      AND  
      	t1.skartiert = '0'  
      AND  
      	t1.kostenstelle >= '".$ks_min."'  
      AND  
      	t1.kostenstelle <= '".$ks_max."'  
      AND  
      	t1.aktiv = '1'  
      ORDER BY  
      	t1.requester ASC  
    
      
    Nur so nebenbei bemerkt:  
    Du nimmst doch aber nachher keine Post-Paramter ungeprüft in ein SQL-Satement auf?  
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>