LEFT JOIN zeigt zu viele Einträge oder nicht passend

09/21/2020 05:36 Cc_Cc_Cc#1
Guten Tag,

ich wollte 3 Tabellen mit Left Join verknüpfen. Entweder zeigt er mir zufälliger Weise 284 Einträge an obwohl es nur 20 existieren oder er zeigt bei einer Tabelle immer die gleichen Records an. Nach 3 Stunden google und etlichen Versuchen komm ich nicht weiter.

Tabellen-Struktur:


Die Möglichkeit sagt mir das es 289 Einträge gibt obwohl ich ca 20-22 (10 in der einen und 10 in der anderen Tabelle)

Wenn ich bei dem obigen Code noch ein Group by dc.id hinzufüge, klappt die domain_check Tabelle aber bei SSL_INFO zeigt er mir ganze Zeit das erste Ergebnis an. Anders rum mit s1.id zeigt er mir jedes mal das gleiche Ergebnis bei Domain_check an.

Mit diesem Befehl zeigt er mir an das ich 18523 Beiträge habe...


ich möchte nur 3 Tabellen verknüpfen und halt alle ausgeben.

Das Endergebnis sollte eig so aussehen:

domain | ssl_check | ssl_name
domain.de 1 ENCRYPT
domain.de 1 NEW ENCRYPT
domain.de 1 NEW ENCRYPT

aber entweder zeigt er es so an:

domain | ssl_check | ssl_name
domain.de 1 ENCRYPT
domain.de 1 ENCRYPT
domain.de 1 ENCRYPT


oder er zeigt mir an das ich über 200 bis 18.000 Beiträge habe obwohl 20 max existieren.
09/21/2020 13:17 Legithos#2
Quote:
Originally Posted by Cc_Cc_Cc View Post

Tabellen-Struktur:

Code:
Tabelle 1 Domain

ID -- DOMAIN -- DATE

1	  domain.de   DATE...

Tabelle 2 DOMAIN_CHECK

ID -- DOMAIN_ID -- SSL_CHECK 
1		1			 1
2		1			 1
3              1                        1

Tabelle 3 SSL_INFO

ID -- DOMAIN_ID -- SSL_NAME --
1		1			ENCRYPT
2		1			NEW ENCRYPT
3		1			NEW ENCRYPT
Du solltest es auf alle Fälle vermeiden, alle Spalten mit * auszulesen - am besten immer alle benennen. Wenn du hier alle Daten haben willst, sollte die Lösung wie folt aussehen:


Das sollte die Lösung für die Tabellen sein.
09/21/2020 13:54 Cc_Cc_Cc#3
Quote:
Originally Posted by Legithos View Post
Du solltest es auf alle Fälle vermeiden, alle Spalten mit * auszulesen - am besten immer alle benennen. Wenn du hier alle Daten haben willst, sollte die Lösung wie folt aussehen:


Das sollte die Lösung für die Tabellen sein.
Hi, erstmals danke^^
Hab es mit deiner Lösung probiert:

Er zeigt mir an das ich 289 Datensätze habe, obwohl nur 17 bei domain_check existieren und 17 bei ssl_info. Wie kann das sein?
09/21/2020 14:52 Legithos#4
Das müsste ich mir anschauen, adde mich mal in Discord. Bliind#0993
09/21/2020 16:19 Shino#5
Bist du dir bewusst was die einzelnen Joins machen?
Hier ein guter Link dafür: [Only registered and activated users can see links. Click Here To Register...]

Sieht ganz danach aus, dass du all deine Datensätze die join Bedingung erfüllen (dc.domain_id = d.id, s1.domain_id = d.id) und deine erste Tabelle wahrscheinlich nur einen Eintrag hat. Dadurch wird jeder Datensatz von domain check mit ssl info gejoint (aus einem Datensatz wird dann 17). Das ganze passiert wohl dann 17 mal (weil 17 Einträge aus domain check) und schon hast du deine 289 Einträge.

Ich bin mir nicht ganz sicher was du erreichen möchtests, aber sieht eher nach einem inner join aus.
09/21/2020 16:32 Cc_Cc_Cc#6
Quote:
Originally Posted by Shino View Post
Bist du dir bewusst was die einzelnen Joins machen?
Hier ein guter Link dafür: [Only registered and activated users can see links. Click Here To Register...]

Sieht ganz danach aus, dass du all deine Datensätze die join Bedingung erfüllen (dc.domain_id = d.id, s1.domain_id = d.id) und deine erste Tabelle wahrscheinlich nur einen Eintrag hat. Dadurch wird jeder Datensatz von domain check mit ssl info gejoint (aus einem Datensatz wird dann 17). Das ganze passiert wohl dann 17 mal (weil 17 Einträge aus domain check) und schon hast du deine 289 Einträge.

Ich bin mir nicht ganz sicher was du erreichen möchtests, aber sieht eher nach einem inner join aus.
Genau so macht der das mit den 17 Einträgen usw, aber hab das jetzt mit Inner Join versucht, das geht auch nicht damit. ich checks einfach nicht...
09/21/2020 16:55 Shino#7
Also hab mir mal die Mühe gemacht und deine Datenbankstruktur mal kopiert und mit ähnlichen Daten zu füllen.

Wo genau hängt es bei dir?

Und so ein allgemeiner Tipp von mir: Versuche, wenn du eine Aufgabe/Problem lösen willst, dir klar zu machen was deine Ausgangslage ist und zu welchem Ergebnis du kommen möchtest. Das macht das Fragestellen deutlich einfacher für andere zu verstehen und gibt dir eine klarere Struktur darüber was du machen solltest.
09/21/2020 17:40 Cc_Cc_Cc#8
Quote:
Originally Posted by Shino View Post
Also hab mir mal die Mühe gemacht und deine Datenbankstruktur mal kopiert und mit ähnlichen Daten zu füllen.

Wo genau hängt es bei dir?

Und so ein allgemeiner Tipp von mir: Versuche, wenn du eine Aufgabe/Problem lösen willst, dir klar zu machen was deine Ausgangslage ist und zu welchem Ergebnis du kommen möchtest. Das macht das Fragestellen deutlich einfacher für andere zu verstehen und gibt dir eine klarere Struktur darüber was du machen solltest.
Das er mir nicht 17 Ergebnisse anzeigt sondern 289. Oben hab ich nur ein bsp gemacht mit der Tabelle, da sind 17 Einträge drinne. Er soll mir einfach nur meine 17 Datensätze anzeigen und nicht 289 Datensätze. Er macht sozusagen 17x17 also jeder Datensatz * (Mal) 17. 17*17 sind auch 289 ich weiß nicht warum er mir soviele anzeigt, da ich nicht mal soviele Einträge drin stehen habe
09/21/2020 18:17 Shino#9
Quote:
Let’s start by reminding ourselves what a LEFT JOIN is and how to use it. You might remember that an INNER JOIN returns only the records that are in both tables. In contrast, a LEFT JOIN in SQL returns all records (or rows) from the left table and only the matched records (or rows) from the right. This implies that, if a specific row is present in the left table but not in the right, the result will include this row but with a NULL value in each column from the right. If a record from the right table is not in the left, it will not be included in the result.
Quelle: [Only registered and activated users can see links. Click Here To Register...]

Also nochmal: Schau dir gerne nochmal die joins an.
Angenommen deine Tabelle domain besitzt folgende Datensätze:
id, domain, date
1, domain.de, 2020-09-21

und domain_check:
ID - domainId - sslCheck
1, 1, 1
2,1,1
3,1,1

und ssl_info:
ID, domainId, sslName
1,1,ENCRYPT
2,1,NEW ENCRYPT
3, 1, NEW ENCRYPT

Dann bekommst du mit einem left join on domain.id = domain_check.domainID folgendes zurück (Join1 Datensatz1):
id domain date id domainId sslCheck
1 domain.de 2020-09-21 1 1 1
1 domain.de 2020-09-21 2 1 1
1 domain.de 2020-09-21 3 1 1

Warum?
Weil dein Datensatz aus domain die id 1 hat und alle Datensätzen aus domain_check die domainId 1 haben. Also wird 1, domain.de, 2020-09-21 jeweils mit (1, 1, 1), (2,1,1), (3,1,1) gejoint.

Wenn wir diesen Datensatz jetzt nochmal mit einem left join on ssl_info.domainId = domain.id joinen dann bekommen wir:
1 domain.de 2020-09-21 1 1 1 1 1 ENCRYPT
1 domain.de 2020-09-21 2 1 1 1 1 ENCRYPT
1 domain.de 2020-09-21 3 1 1 1 1 ENCRYPT
1 domain.de 2020-09-21 1 1 1 2 1 NEW ENCRYPT
1 domain.de 2020-09-21 2 1 1 2 1 NEW ENCRYPT
1 domain.de 2020-09-21 3 1 1 2 1 NEW ENCRYPT
1 domain.de 2020-09-21 1 1 1 3 1 NEW ENCRYPT
1 domain.de 2020-09-21 2 1 1 3 1 NEW ENCRYPT
1 domain.de 2020-09-21 3 1 1 3 1 NEW ENCRYPT

Warum?
Weil jetzt wieder für jeden Datensatz die join Bedingung erfüllt ist. Das bedeutet der gesamte Datensatz aus Join1 Datensatz1 wird mit dem Datensatz aus ssl_info gejoint. Daraus entstehen halt 3*3 Datensätze.
(1 domain.de 2020-09-21 1 1 1) wird jeweils gejoint mit (1,1,ENCRYPT), (2,1,NEW ENCRYPT), (3, 1, NEW ENCRYPT) usw..

Dadurch bekommst du halt viele Datensätze zusammen, weil deine Join Bedingung auf alle Einträge gültig ist.


Eventuell solltest du dir nochmal deine Join Bedingung anschauen und dir überlegen, was du dort eig machst und was du vorhast. Ich habe leider keinerlei Plan, was du am Ende haben möchtest.

Edit: Für schnelle Fragen kannst du mich natürlich auch gerne in Discord adden.
09/21/2020 18:55 Cc_Cc_Cc#10
Quote:
Originally Posted by Shino View Post
Quelle: [Only registered and activated users can see links. Click Here To Register...]

Also nochmal: Schau dir gerne nochmal die joins an.
Angenommen deine Tabelle domain besitzt folgende Datensätze:
id, domain, date
1, domain.de, 2020-09-21

und domain_check:
ID - domainId - sslCheck
1, 1, 1
2,1,1
3,1,1

und ssl_info:
ID, domainId, sslName
1,1,ENCRYPT
2,1,NEW ENCRYPT
3, 1, NEW ENCRYPT

Dann bekommst du mit einem left join on domain.id = domain_check.domainID folgendes zurück (Join1 Datensatz1):
id domain date id domainId sslCheck
1 domain.de 2020-09-21 1 1 1
1 domain.de 2020-09-21 2 1 1
1 domain.de 2020-09-21 3 1 1

Warum?
Weil dein Datensatz aus domain die id 1 hat und alle Datensätzen aus domain_check die domainId 1 haben. Also wird 1, domain.de, 2020-09-21 jeweils mit (1, 1, 1), (2,1,1), (3,1,1) gejoint.

Wenn wir diesen Datensatz jetzt nochmal mit einem left join on ssl_info.domainId = domain.id joinen dann bekommen wir:
1 domain.de 2020-09-21 1 1 1 1 1 ENCRYPT
1 domain.de 2020-09-21 2 1 1 1 1 ENCRYPT
1 domain.de 2020-09-21 3 1 1 1 1 ENCRYPT
1 domain.de 2020-09-21 1 1 1 2 1 NEW ENCRYPT
1 domain.de 2020-09-21 2 1 1 2 1 NEW ENCRYPT
1 domain.de 2020-09-21 3 1 1 2 1 NEW ENCRYPT
1 domain.de 2020-09-21 1 1 1 3 1 NEW ENCRYPT
1 domain.de 2020-09-21 2 1 1 3 1 NEW ENCRYPT
1 domain.de 2020-09-21 3 1 1 3 1 NEW ENCRYPT

Warum?
Weil jetzt wieder für jeden Datensatz die join Bedingung erfüllt ist. Das bedeutet der gesamte Datensatz aus Join1 Datensatz1 wird mit dem Datensatz aus ssl_info gejoint. Daraus entstehen halt 3*3 Datensätze.
(1 domain.de 2020-09-21 1 1 1) wird jeweils gejoint mit (1,1,ENCRYPT), (2,1,NEW ENCRYPT), (3, 1, NEW ENCRYPT) usw..

Dadurch bekommst du halt viele Datensätze zusammen, weil deine Join Bedingung auf alle Einträge gültig ist.


Eventuell solltest du dir nochmal deine Join Bedingung anschauen und dir überlegen, was du dort eig machst und was du vorhast. Ich habe leider keinerlei Plan, was du am Ende haben möchtest.

Edit: Für schnelle Fragen kannst du mich natürlich auch gerne in Discord adden.
Wollte das so haben:
domain | ssl_check | ssl_name
domain.de 1 ENCRYPT
domain.de 1 NEW ENCRYPT
domain.de 1 NEW ENCRYPT

das er das nicht immer mal 3 oder mal 7 macht. einfach die neusten ergebnisse mit anderen Tabellen wo die gleiche domain name oder domain id ist
09/21/2020 19:34 Shino#11
Also das Ganze geht so in die Richtung debugging.
Als erstes solltest du dir klar sein, was du mit deinen join Bedingungen machst (was ich oben hoffentlich verständlich erklärt habe, wenn nicht einfach nachfragen).

Ein bisschen Overkill aber eine ganz gute Übung ist denke ich mal ein Entity-Relationship Modell für deine (kleine) Datenbank anzulegen. Ist auch sehr gut um die Grundlagen zu lernen. Einfach mal googlen darüber ist viel im Internet.
Dadurch sollte dir bewusst werden wie deine Daten/Tabellen miteinander zusammenhängen und wie man eventuell die Struktur ändern sollte, damit du zu deinem gewünschtem Ergebnis kommen kannst.

Ich habe z.B. keinen Plan wie deine Daten zusammenhängen. Welche Beziehung hat die Tabelle ssl_info zu domain_check? Gibt es für einen Eintrag in ssl_info einen zugehörigen Eintrag in domain_check oder gibt es mehrere? All die Fragen werden durch ein ER Modell geklärt und für jeden verständlich gemacht.
09/22/2020 13:59 Legithos#12
Vielleicht solltest du auch erstmal mit einem JOIN beginnen und dann weitere JOIN's dranhängen, wenn beim ersten JOIN keine fehlerhafte Ausgabe kommt. Dann kannst du den Fehler besser lokalisieren.
09/23/2020 02:24 Cc_Cc_Cc#13
Quote:
Originally Posted by Legithos View Post
Vielleicht solltest du auch erstmal mit einem JOIN beginnen und dann weitere JOIN's dranhängen, wenn beim ersten JOIN keine fehlerhafte Ausgabe kommt. Dann kannst du den Fehler besser lokalisieren.
Hab wirklich vieles ausprobiert, hab es diesmal so gemacht, er zeigt auch alles richtig an aber er gibt mir nicht die neusten Rekorde bei ssl_info. Er sagt immer den gleichen SSL_Namen.

[Only registered and activated users can see links. Click Here To Register...]

Das sollte eig dann so aussehen:

1 1 1 1 SSL_TELEKOM
1 1 0 1 SSL_TELEKOM
1 1 1 1 SSL_MEDIA
1 1 1 1 SSL_MEDIA