[MySQL] Nicht enthaltene Datensätze ausgeben (JOIN)

SP7

Grünschnabel
Hallo zusammen,
Ich schlag mich jetzt schon sehr lange mit der selben Abfrage rum. Google, Sufu, ... nütze nichts.

Mein Vorhaben ist folgendes:

Ich habe 2 Tabellen, welche wie folgt aufgebaut sind:

Tabelle User:
user.JPG


Tabelle Log:
log.JPG

Nun möchte ich z.B alle userids ausgeben, welche nicht bereits mit id 1 in der Tabelle log eingetragen wurden.

Aktuell habe ich folgendes Statement, allerdings sollte man dieses Reversen damit ich auf die Lösung komme:
Code:
SELECT l.userid
FROM user AS u
LEFT JOIN log AS l ON l.id = u.id
WHERE u.id = 1

Das Statement reversed sollte als Lösung wenn wir die ID 1 nehmen folgendes ausgeben:
Userid:
354
355
356

Ich würd mich über eine Lösung freuen :)
 
hi, also wenn NICHT die Datensätze, die mit der ID = 1 in der Log Tabelle angezeigt werden müssten, dann sollte doch anstatt: "WHERE u.id = 1" eignetlich "WHERE u.id > 1" oder "<> 1"

ausserdem kann 354 nicht ausgegeben werden, weil ich das zumindest nicht in der log-tabelle sehe :) hoffentlich hilft das
 
hi, also wenn NICHT die Datensätze, die mit der ID = 1 in der Log Tabelle angezeigt werden müssten, dann sollte doch anstatt: "WHERE u.id = 1" eignetlich "WHERE u.id > 1" oder "<> 1"

ausserdem kann 354 nicht ausgegeben werden, weil ich das zumindest nicht in der log-tabelle sehe :) hoffentlich hilft das

Danke für deine rasche Antwort, allerdings hab ich mich sehr wahrscheinlich zu ungenau ausgedrückt :(

Ich probiers erneut:)

Das Statement soll folgendes machen:

Es nimmt von einem User aus der Tabelle 'User' die ID und schaut dann in der Tabelle Logs unter ID alle Einträge des Users an. Bei der ID 1 wären dies 352 und 353. Nun soll das Statement mir ausgeben, welche UserID's unter logs mit der ID 1 noch nicht vorhanden sind.

Als praktisches Beispiel:
Ich habe eine Packung Kekse. Ich gebe jedem User einen Keks, allerdings hab ich nach 3 Keksen vergessen, wem ich schon einen gegeben habe und wem nicht. Nun will ich dies anhand eines Statements ermitteln.

Hoffe Ihr versteht mich jetzt :D
 
SQL:
SELECT
   u.userid
FROM
   user AS u
WHERE
   u.userid NOT IN
      (SELECT l.userid FROM log AS l WHERE id=1)

Sollte so eigentlich stimmen, wobei ich mit der Logik immer so nen Problem hab mit den temporären Listen...
 
  • Gefällt mir
Reaktionen: SP7
Hey,

(Kekse ftw!)

Leider wird mir auch nach deiner zweiten Erklärung nicht recht klar, was du erreichen möchtest.

Entweder möchtest du alle User selektieren, die in Tabelle log vorkommen, dort aber nicht mit id = 1:

SQL:
SELECT l.userid
FROM user AS u
INNER JOIN log AS l ON l.id = u.id AND l.id != 1

Das INNER JOIN beschränkt die Schnittmenge dabei auf die User, die in log vorkommen, und das angefügte AND beschränkt nochmal auf die Datensätze, bei denen id ungleich 1 ist. Dann sollte es aber m.E. auch ausreichen, nur die log-tabelle abzufragen, wenn da eh auch die UserIDs vorhanden sind (die Relation zwischen den beiden Tabellen begreif ich nicht ganz), also

SQL:
SELECT l.userid
FROM log AS l
WHERE l.id != 1

ODER

du willst alle User aus der User-Tabelle, die entweder nicht in log stehen ODER dort nicht mit id = 1 vertreten sind:

SQL:
SELECT u.userid, l.id
FROM `user` AS u
LEFT JOIN log as l ON u.userid = l.userid
WHERE l.id IS NULL OR l.id != 1

Das stimmt aber nicht mit der Resultliste überein, die du im ersten Beitrag geschrieben hast.

ODER

du müsstest dir noch so 'ne Metapher überlegen (bleib ruhig bei den Keksen) :rolleyes:
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: SP7
So wie ich es verstanden (und auch umgesetzt) habe, möchte er alle User (wir gehen mal nur von den IDs aus, der Rest ist Pustekuchen), die keinen Eintrag in der Logtabelle mit einer ID=1 haben.

PS: Das mit den Keksen hatte ich zuerst überlesen, machts aber um einiges unverständlicher. ^^ Zum Glück erklärst du es vorher anders. :D
 
Zuletzt bearbeitet:
Danke Leute weiss leider echt nicht wie ich es erklären soll damit es jemand nachvollziehen kann :S

Ich mach ma nen anderes Fallbeispiel hoffentlich löst dies das wirrwarr in unseren Köpfen..:)

Ich habe ein PHP Script bei dem der User einen überblick über alle anderen Users bekommt (Liste).
Nun kann der User jedem anderen User jeweils einen Keks geben(damit wir bei den keksen bleiben :)). Dies geschieht in diesem Beispiel über einen link. Sobald der eingeloggte User nun den Link aufruft macht es in der Tabelle 'log' einen Eintrag.

ID = Die des eigneloggten users
UserID = Die UserID, welche in der Tabelle Users hinterlegt ist (3-stellig), welcher den Keks bekommt.

Nun soll dem eingeloggten User nur noch die Users angezeigt werden, dennen er noch keinen Keks gegeben hat. Es muss über ein SQL Statement realisiert werden wegen den Performance Gründen. Über PHP würde es kein Problem für mich darstellen dies zu realisieren.

Hoffe Ihr verstehts jetzt :)
 
Haste meins überhaupt mal probiert? ^^

Upps war zufest von deinem Titel abgelenkt, Frisch fruchtig :D
Habs getestet TOP!

Leider hat es aber noch einen kleinen Schönheitsfehler :S

Er zeigt mir noch die Userid von dem eingeloggten user an ....
Also bei User 2 zeigt er mir zb folgendes an:

351
352 - Dies ist aber die UserID von ihm selber... Die müsste weg.
353
354

Danke schonmau ;)
 
Aso das is ja kein Thema^^

SQL:
SELECT
   u.userid
FROM
   USER AS u
WHERE
   u.userid NOT IN
      (SELECT l.userid FROM log AS l WHERE id=1)
   AND
      userid != 352
 
  • Gefällt mir
Reaktionen: SP7
Zurück