[SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vorkomme

godlike

Warp drölf
Veteran
Registriert
13 Juli 2013
Beiträge
14.290
Ort
Topkekistan
Evtl ganz einfach aber ich komm nicht drauf. Habe Zwei Tabellen - Tabelle1 & Tabelle2. Diese sind vom Aufbau gleich. Tabelle1 ist die Basistabelle, Tabelle2 ist ein Duplikat enthält aber nicht alle Einträge von Tabelle1 sondern nur einen Teil (Quasi kleine Änderungen usw., die Unique IDs sind aber die Selben). Nun bräuchte ich eine Abfrage bzw. Ausgabe von allen Einträge der Tabelle1 deren IDs NICHT in Tabelle2 vorkommen.

Und daran hänge ich gerade fest. Wie kann ich diese gescheit vergleichen? Angenommen ich bräuchte als Ausgabe die Spalte Mail und Name aus Tabelle1 ohne die Einträge aus Tabelle2 - da diese nach einem Login aus Tabelle1 dupliziert und ggf. verändert wurden.

Hintergrund ist das ich allen die noch nicht eingeloggt waren, sprich noch keine Duplikat ihres DB-Eintrages erstellt wurde, eine Erinnerungsmail schicken möchte.

Ideen?

Gruß godlike

Nachtrag: Ich habs!

SELECT tabelle1.mail, tabelle1.name FROM tabelle1 WHERE tabelle1.id NOT IN ( SELECT DISTINCT tabelle2.id FROM tabelle2 )
 
Zuletzt bearbeitet:
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Das DISTINCT-Keyword benötigst du nicht, da die IDs einmalig sind.
 
  • Thread Starter Thread Starter
  • #3
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Danke für den Hinweis!
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Mal eine blöde Frage - ist es performanter den Query für jeden Wert über eine gesamte Tabelle zu machen oder die Werte nach Möglichkeit zwischenzuspeichern, um dann auf ein einmal ausgelesenes Array die Abfragen durchzuführen?

Ich kann mir aber schon vorstellen das meine "Frage" sich bei riesigen Datenmengen in Tabelle 2 ad absurdum führen könnte bzw. gar unmöglich ist... ;)

Wobei, mit dem SELECT werden ja dann eh "alle" Werte auch in den Speicher gelesen, es käme dann wohl aufs fast gleiche raus. Wäre nur die Frage wo die Performance besser wäre?!
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Das müsste man testen, in der Regel hat MySQL aber recht gute Cache- und Parallelisierungsmethoden schon einkompiliert. Falls man nichts grob falsches in seinen Abfragen hat (Rekursion, mehrfach verschachtelte JOINs) geht das auch recht schnell. Insbesondere in godlikes Anwendungsfall ist es ja aber egal, ob die Abfrage 10, 100 oder 1000ms dauert.

Ich empfehle übrigens die Verwendung von MariaDB statt Oracle MySQL, das hat dann noch mal ein paar Verbesserungen durch die FOSS-Community erhalten. Ist unter Debian und Ubuntu glaube ich standard.
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

@phre4k

Ich vermute auch mal das man häufige Queries Cached - und die Datenmengen vielleicht bei einem SELECT auf X begrenzt und dann mit unsichtbarer "Pagination" arbeitet?
Sonst könnte man vermutlich keine großen Tabellen problemfrei SELECTen/abfragen.
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Allgemein ist Select * xxxx recht schlecht. Die Querys nehmen schon nur die Datenmenge die du haben möchtest und sortieren, gruppieren, joinen.... diese Weiter.
Das heißt wenn du die Selektierte Datenmenge klein hält geht das schon schneller und braucht weniger Ram.
Welche messbaren Auswirkungen das hat ist eine andere Sache - das hängt schlicht von der Menge ab. Bei über 100.000 Einträgen und 50 Spalten merkt man es aber durchaus auch ohne Zeitmessung.

Das Query-Caching ist übrigens zumindest bei Mysql nicht / oder nicht in allen Distributionen / im Standard aktiv. Das muss man selber konfigurieren und ist auch durchaus Sinnvoll insofern man öfter gleiche Querys erwartet.
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Im vorliegenden Fall wäre mir keine effizientere Methode bekannt, außer die Daten anders anzuordnen (dritte Tabelle oder zusätzliche Spalte in der ersten Tabelle mit ID und Boolean für Angemeldet ja/nein).
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

ne im vorliegen Fall ist das klar, wobei trotzdem Spalten die evtl. nicht für die Ausgabe benötigt werden - k.a Timestamp's, user der geändert hat.. gibt ja ab und an trotzdem Info in so einer Tabelle die nicht immer Sichtbar sein müssen - reduziert werden könnten.

War auch eher für Split und das *allgemeine* Thema.
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Du könntest auch Joinen, was bei größeren Tabellen durchaus perfomanter ist. Ich weiß, bei dir nicht unbedingt wichtig, aber nur fürs Protokoll :D

SELECT tabelle1.mail, tabelle1.name FROM tabelle1
LEFT JOIN tabelle2
ON tabelle1.id = tabelle2.id
WHERE tabelle2.id IS NULL

Hab ich aus dem Kopf gemacht, keine Garantie für Funktion :T
 
  • Thread Starter Thread Starter
  • #11
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Da ich den Query eh nur ein mal im Jahr in PhpmyAdmin ausführe um da ne csv raus zu holen ist Performance jetzt nicht so wichtig :D Aber trotzdem danke ;)
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Es geht um den USE-CASE Godlike, ob man solche Queries in seiner Software haben sollte.

Wenn du natürlich Tabelle 2 klein hälst weil nur neue / unbeantwortete Anfragen dort stehen und alles andere gelöscht wird, ist das okay, aber über kurz oder lang sollte man seinen Datenstruktur ändern oder den Query nicht so "mächtig" machen... das war auch meine Frage/Anliegen.

Ich kenne die internas von SQL (mySQL) nicht. Und weiß nicht in wie weit man auf einem kleinen System so einen Query ohne Probleme bzw. mit 100k+ Einträgen in einer Tabelle und die andere mit 500k+, fahren kann. :)
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

Um die nicht enthaltene Menge der Tabelle1 in Tabelle2 zu identifizieren verwende ich immer "minus"

select a from tabelle1
minus
select a from tabelle2

gibt Dir alle Werte der Tabelle 1 zurück, die nicht in Tabelle 2 enthalten sind. Mit der Rückgabe könntest du nun weitere Werte in Tabelle1 suchen und für Deine Auswertungen verwenden.

Allerdings sind hier auch schon gute Varianten genannt worden. Z.B. die werner
 
Re: [SQL] Abfrage 2 Tabellen - Ausgabe nur Werte welche in zweiter Tabelle nicht vork

viewer.php
 
Zurück
Oben