Ankündigung

Einklappen
Keine Ankündigung bisher.

doppelte Einträge filtern

Einklappen

Neue Werbung 2019

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

  • doppelte Einträge filtern

    Hi, mal sehn wie ich das Problem klar formuliere. Hoffentlich könnt ihr mir helfen.

    Also ich habe 3 Tabellen A, B,C. Tabelle C ist die Verbindungstabelle.
    Also eine 1: n Beziehung.

    Wenn ich das aber nun in eine Schleife packe und aus Tabelle A alle passenden Spalteneinträge zu holen, die mit zu einem Spalteneintrag Tabelle B gehören, kommt es durch die Schleife zu einer doppelten Anzeige.

    Wie kann ich das in der Select Abfrage verhindern? Limit geht nicht da wird nur die Menge der gefundenen Zeilen begrenzt.
    Kann man das mir der Abfrage verhindern , filtern?

    Bitte helft mir.

  • #2
    Re: doppelte Einträge filtern

    Zitat von TailerD
    Also ich habe 3 Tabellen A, B,C. Tabelle C ist die Verbindungstabelle.
    Also eine 1: n Beziehung.
    Meinst du nicht eher eine n:m Beziehung? Für eine 1:n Beziehung sollten zwei Tabellen ausreichen.

    Zitat von TailerD
    Wenn ich das aber nun in eine Schleife packe und aus Tabelle A alle passenden Spalteneinträge zu holen, die mit zu einem Spalteneintrag Tabelle B gehören, kommt es durch die Schleife zu einer doppelten Anzeige.
    So ganz verstehe ich dein Problem noch nicht. Erkläre das mal an ein paar Beispieldatensätzen.

    Kommentar


    • #3
      Sind nicht n:m Beziehungen eigendlich mehre 1:n Beziehung? Es sind mehr als 2 Tabellen.

      TBL_A
      "id_A"|"aVorname"|"aNachname"
      1|"Werner"|"Meier"
      2|"Sabine"|"Müller"
      3|"Gabriel"|"Schulze"
      4|"Joseph"|"Wildbrum"
      5|"Ulrike"|"Körner"

      TBL_B
      "id_B"|"bTiername"|"bTierart"|"bTieralter"
      1|"Schnuffel"|"Hase"|"12"
      2|"Janosch"|"Meerschwein"|"5"
      3|"Mucki"|"Gerda"|"3"
      4|"Charly"|"Katze"|"8"

      TBL_C
      "id_C"|"id_A"|"id_B"
      1|"1"|"4"
      2|"1"|"3"
      3|"1"|"2"
      4|"2"|"1"

      Die Ausgabe mit der Abfrage:
      SELECT TBL_A.aVorname, TBL_B.bTierart
      FROM TBL_B INNER JOIN (TBL_A INNER JOIN TBL_C ON TBL_A.id_A = TBL_C.id_A) ON TBL_B.id_B = TBL_C.id_B;

      Werner Katze
      Werner Gerda
      Werner Meerschwein
      Sabine Hase


      Eine Kunde kann mehrere Tiere haben aber eine Tier gehört zu nur einem Kunden. Das Beispiel ist vielleicht etwas blöd. Es geht mir eigendlich nur darum, wie ich es anstelle, das wenn Werner eine Warengruppe wäre, das Werner dann nur einmal auftaucht.

      Hat vielleicht jemand eine Idee? Ich weiß irgendwie nicht so wie ich das anstellen soll.

      Kommentar


      • #4
        Soll ich lieber im Php Forum nachfragen? Ist vielleicht nur ne If Abfrage aber wie den?
        Ich dachtwe irgendwie wenn das schon mal ausgelesen wurde dann nicht anzeigen.Ich weis nur nicht wie ich da jetzt denken muss?

        Kommentar


        • #5
          Hallo,
          für Tabelle-C benötigst du nur 2 Spalten, da es sich um eine Verknüpfungs-Tabelle handelt, ist der Primärschlüssel bereits durch die Kombination von Spalte 1 und 2 gegeben. Denn diese Kombination ist eindeutig und es macht keinen Sinn, doppelte Kombinationen zuzulassen.

          Bau also Tabelle-C so auf, dass Spalte-Besitzer und Spalte-Tier zusammen den Primärschlüssel ergeben. Zusätzlich setzt du Spalte-Tier auf Unique. Somit ist sichergestellt, dass eine Kombination nur einmal auftreten kann und ein Tier nur einen Besitzer hat.

          Code:
          SELECT * FROM besitzer
          SELECT lbt.besitzer, tiere.* FROM link_besitzer_tier AS lbt INNER JOIN tiere ON lbt.tier = tiere.id WHERE lbt.besitzer = XY
          Achte darauf, die 2. Abfrage nicht in eine Schleife zu setzen, um alle Tiere aller Besitzer zu bekommen, denn SQL-Abfragen in Schleifen sollte man vermeiden.

          Du könntest stattdessen alle Besitzer-IDs sammeln und mit dieser Sammel-Information eine Abfrage auf link_besitzer_tier (Tabelle-C also) stellen.
          Code:
          WHERE lbt.besitzer IN (besitzerX, besitzerY, ..)
          Und die Datensätze dann anhand der lbt.besitzer wieder dem Besitzer zuordnen.
          Damit hättest du die n:m Beziehung mit nur 2 SQL-Abfragen aufgelöst, statt 1 + Anzahl-der-Besitzer SQL-Abfragen.

          Ich hoffe das war verständlich

          Kommentar


          • #6
            Irgendwie nicht so ganz.

            Zitat von Zergling
            Hallo,
            für Tabelle-C benötigst du nur 2 Spalten, da es sich um eine Verknüpfungs-Tabelle handelt, ist der Primärschlüssel bereits durch die Kombination von Spalte 1 und 2 gegeben.
            ok

            Zitat von Zergling
            Denn diese Kombination ist eindeutig und es macht keinen Sinn, doppelte Kombinationen zuzulassen.
            Das mit den Tieren war ein Beispiel,bei dem ich dachte ich könnte das besser verstehn. Die eigentliche Vebindungstabelle sieht so aus. Vielleicht ist der NAme Zuordnungstabelle auch besser.
            Ist das falsch wenn doppelte Kombinationen vorkommen? Ich meine ich weis Redundanz soll so weit wie möglich verhindert werden. Auf eine Zeile insgesamt doppelte Einträge, gezwungender MAssen vorhanden, aber die Zeile durch den eindeutigen Artikel Spalte id_a wieder nicht doppelt vorhanden.
            Code:
            //lbtZuordnungstabelle
            id_wg=Warengruppe; id_prg=Produktgruppe (=Warenuntergruppe)
            id_artg=Artikelgruppe; id_a=Artikel
            
            id_wg | id_prg | id_artg  | id_a   	
            2     |  4     |   12 	 |  14 	
            2     |  7     |   10 	 |  11 	
            2     |  6     |   5      |  6 	
            2     |  4     |   1      |  1 	
            2     |  4     |   16 	 |  5 	
            2     |  4     |   7      |  9

            Bau also Tabelle-C so auf, dass Spalte-Besitzer und Spalte-Tier zusammen den Primärschlüssel ergeben. Zusätzlich setzt du Spalte-Tier auf Unique. Somit ist sichergestellt, dass eine Kombination nur einmal auftreten kann und ein Tier nur einen Besitzer hat.
            ok dann setze ich in dem Fall Spalte Artikel (id_a) auf Unique.

            Achte darauf, die 2. Abfrage nicht in eine Schleife zu setzen, um alle Tiere aller Besitzer zu bekommen, denn SQL-Abfragen in Schleifen sollte man vermeiden.
            Ein guter Tipp. Wusste ich auch noch nicht. Bei mir ist das so, das hab ich versucht SQL-Abfragen in Schleifen zu vermeiden, nur dann wird immer nur der letzte gefunden Datensatz angezeigt.

            Du könntest stattdessen alle Besitzer-IDs sammeln und mit dieser Sammel-Information eine Abfrage auf link_besitzer_tier (Tabelle-C also) stellen.
            Code:
            WHERE lbt.besitzer IN (besitzerX, besitzerY, ..)
            Und die Datensätze dann anhand der lbt.besitzer wieder dem Besitzer zuordnen.
            Hab grad mal das Mysql Referenzhandbuch. chm geholt. In () ist super. Meinen die mit Konstanten, könnte ich da die Id's reinsetzen, aber ne das geht auch nicht, weil in nicht die gesamte Liste sondern nur einzelne Werte berücksichtigt.

            Damit hättest du die n:m Beziehung mit nur 2 SQL-Abfragen aufgelöst, statt 1 + Anzahl-der-Besitzer SQL-Abfragen.
            Verstehe wegen innerhalb der Schleife.

            Ich hoffe das war verständlich
            Irgendwie nicht ganz.Tut leid ich bin da neu.
            Wie könnte ich die Zuordungstabelle anders lösen, weil es doch vorkommen kann das eine Warengruppe viele Produktgruppen enthält, Produktgruppen viele Artikelgruppen haben können aber von jeweils hinten gesehen z.b ein Artikel in eine Warengruppe,Produktgruppe und Artikelgruppe gehört.

            Ich versteh das irgendwie nicht. Ist die Wahl einer Zuordnungstabelle falsch?

            Kommentar


            • #7
              kann gerade nur kurz antworten:
              pro Zuordnung eine Tabelle.

              Warenkorb hat n Produkte
              Produkte hat n Artikel

              Also 2 Verbindungs-Tabellen und nicht nur eine - so wie du das gerade glaube ich gemacht hast.

              Kommentar


              • #8
                Wie warum jetzt Warenkorb? Keine Problem, habs grad gefunden DISTINCT ist die Lösung

                Kommentar

                Lädt...
                X