php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.07.2006, 20:41  
Benutzer
 
Registriert seit: 02.06.2006
Beiträge: 53
TailerD
Standard 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.
TailerD ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 11.07.2006, 20:43  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard Re: doppelte Einträge filtern

Zitat:
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:
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.
xabbuh ist offline   Mit Zitat antworten
Alt 11.07.2006, 21:26  
Benutzer
 
Registriert seit: 02.06.2006
Beiträge: 53
TailerD
Standard

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.
TailerD ist offline   Mit Zitat antworten
Alt 11.07.2006, 22:33  
Benutzer
 
Registriert seit: 02.06.2006
Beiträge: 53
TailerD
Standard

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?
TailerD ist offline   Mit Zitat antworten
Alt 11.07.2006, 22:55  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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
Zergling-new ist offline   Mit Zitat antworten
Alt 12.07.2006, 11:32  
Benutzer
 
Registriert seit: 02.06.2006
Beiträge: 53
TailerD
Standard

Irgendwie nicht so ganz.

Zitat:
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:
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

Zitat:
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.

Zitat:
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.

Zitat:
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.

Zitat:
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.

Zitat:
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?
TailerD ist offline   Mit Zitat antworten
Alt 12.07.2006, 13:09  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.
Zergling-new ist offline   Mit Zitat antworten
Alt 12.07.2006, 13:29  
Benutzer
 
Registriert seit: 02.06.2006
Beiträge: 53
TailerD
Standard

Wie warum jetzt Warenkorb? Keine Problem, habs grad gefunden DISTINCT ist die Lösung
TailerD ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[gelöst]LEFT JOIN, DINSTINCT und trotzdem doppelte?!?! stefanjann Datenbanken 10 06.02.2008 11:49
Doppelte einträge löschen Riks Datenbanken 6 25.04.2007 19:29
Doppelte Positionen filtern ruferp Datenbanken 5 20.02.2007 15:52
Doppelte Einträge aus Array Filtern Robstar Datenbanken 25 01.06.2006 11:56
Doppelte DB-Einträge pro Jahr als 1 Eintrag / Jahr zählen. aherzog PHP Tipps 2006 10 25.03.2006 23:28
Suchen / Filtern mit mehreren Abfragen (optional) wizzardxx Datenbanken 7 28.01.2006 18:40
Select - doppelte Ergebnisse ragman Datenbanken 3 26.01.2006 11:53
Sicherung gegen doppelte Einträge Maho88 PHP Tipps 2006 5 02.01.2006 12:49
nicht doppelte zufallszahlen imported_kontur PHP Tipps 2005-2 6 15.10.2005 17:30
doppelte Werte / Strings einer Spalte nur einmal ausgeben... Datenbanken 2 29.07.2005 12:10
Text aus plain text datei filtern PHP-Fortgeschrittene 7 19.07.2005 15:59
text aus eingabefeld filtern PHP Tipps 2005 13 29.03.2005 17:06
[Erledigt] Doppelte Einträge aus Textdatei entfernen PHP Tipps 2004 11 17.10.2004 15:00
links aus dokument filtern wurtzel PHP-Fortgeschrittene 3 10.09.2004 17:21
Werte aus mehr. dim. Array filtern und zählen PHP Tipps 2004 3 19.08.2004 00:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/datenbanken/41159-doppelte-eintraege-filtern.html, php doppelte einträge filtern, php doppelte einträge verhindern, mysql doppelte einträge verhindern, sql doppelte einträge verhindern, sql doppelte datensätze filtern, doppelte einträge filtern, mysql doppelte einträge filtern, php doppelte id einträge, join 3 tabellen doppelte ergebnisse, php mysql doppelte ergebnisse filtern, sql abfrage doppelte einträge, filtern doppelter sätze aus 2 tabellen, sql doppelte spalteneinträge finden, sql doppelte einträge filtern 2 tabellen, sql gleiche zeilen sollen nur einmal auftauchen join, sql abfrage join doppelte spalten, php doppelten datensatz abfangen, warengruppe produktgruppe, sql abfrage doppelte eintrage filtern

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.