Alles aus Tabelle X was nicht in Y ist, aber wie?

Jabba-deHut

Grünschnabel
Hallo,
ich bin noch recht neu im SQL-Bereich, also bitte nicht auslachen, denn ich stehe auf dem Schlauch und komme nicht weiter.
Ich möchte aus einer Tabelle (videoliste) alle 'Filmname'n haben, bei denen die
'BesitzerId' = 'X' ist, aber ohne jene Filmnamen die auch einen eintrag mit der 'BesitzerId' = 'Y' haben.
Umgangssparchlich: Gib mir die Filmnamen die X hat, aber Y nicht.
Anschließend muß ich das ganze noch mit einer anderen tabelle joinen können.
Habs mit NOT IN, MINUS und div. Joins versucht, doch nichts brachte das was ich suche....
Kann mir da einer weiter helfen?

CREATE TABLE videoliste (
Videolist_Id int(10) NOT NULL AUTO_INCREMENT,
Filmname char(50) NOT NULL,
Format char(10) default NULL,
DVDnummer int(10) default NULL,
Kommentar text(3000) default NULL,
MeineBewertungsPunkte int(2) default NULL,
EintragsDatum int(20) NOT NULL,
BesitzerId int(10) NOT NULL,
PRIMARY KEY (Videolist_Id)
)



SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '1' NOT
IN (

SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '3'
)
 
Hallihallo,

mit MINUS sollte das schon klappen:

SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '1'

MINUS

SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '3'
 
Hi,

Bei deiner Variante müssen das abgefragte Feld des Sub-Selects mit dem aus dem Haupt-Select übereinstimmen.
Beispiel:
SQL:
SELECT * from mytableA WHERE mytableaid NOT IN SELECT mytablebid FROM mytableB
 
Danke erst einmal für eure Antworten!

Hallihallo,

mit MINUS sollte das schon klappen:

SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '1'

MINUS

SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '3'

Dachte ich auch, aber:

Fehler

SQL-Befehl: Dokumentation

SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '1'MINUS
SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '3'
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MINUS SELECT `Filmname` FROM videoliste WHERE `BesitzerId` = '3'
LIMIT 0, 30' at line 1



-------------------------------------

@niggo:wie bitte?
also:
Code:
SELECT * FROM videoliste WHERE `BesitzerId` = '1' NOT IN SELECT `BesitzerId` = '3' FROM videoliste
 
Zuletzt bearbeitet:
Wie siehst so aus?
SQL:
SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '1' 
and `Filmname` NOT IN (
  SELECT `Filmname`
  FROM videoliste
  WHERE `BesitzerId` = '3'
)

Ich habs jetzt mal direkt gepostet, da ja eigentlich nur das "and `Filmname`" vergessen wurde.

Für die Methode mit MINUS SELECT ist Mysql 5.1 nötig. Davor gibts maximal einen UNION SELECT.
 
Zuletzt bearbeitet:
Wie siehst so aus?
SQL:
SELECT `Filmname`
FROM videoliste
WHERE `BesitzerId` = '1' 
and `Filmname` NOT IN (
  SELECT `Filmname`
  FROM videoliste
  WHERE `BesitzerId` = '3'
)

Ich habs jetzt mal direkt gepostet, da ja eigentlich nur das "and `Filmname`" vergessen wurde.

Für die Methode mit MINUS SELECT ist Mysql 5.1 nötig. Davor gibts maximal einen UNION SELECT.


Danke, so scheints zu gehen!
hätte schwören können ich hätte es so ausprobiert....


THX!

Nachtrag:
Im Kleinen funktioniert es, aber wenn ich das ganze noch joinen will bekomme ich ein:
Operand should contain 1 column(s)
Mit PHP bläht sich das ganze auch ziehmlich auf, da sich die ganze SELECT anweisung über ein php-seite zusammenbaut (such- und sortierfunktion usw)
SQL-Anfrage lautete:
Kurze Version:
Code:
SELECT DISTINCT videoliste.*, masterlist.*
FROM masterlist
JOIN videoliste ON ( masterlist.Filmname = videoliste.Filmname )
AND videoliste.BesitzerId = '1'
AND videoliste.Filmname NOT
IN (

SELECT DISTINCT videoliste.*
FROM videoliste
WHERE videoliste.BesitzerId = '3'
)


Ausführlich:
Code:
 SELECT DISTINCT videoliste.Videolist_Id, videoliste.Filmname, videoliste.Format, videoliste.DVDnummer, videoliste.Kommentar, videoliste.MeineBewertungsPunkte, videoliste.EintragsDatum, videoliste.BesitzerId, masterlist.Filmname, masterlist.GesamtbewertungsPunkte_Maenner, masterlist.GesamtbewertungsPunkte_Frauen, masterlist.AbgegebeneBewertungen_Maenner, masterlist.AbgegebeneBewertungen_Frauen, masterlist.Cat_Ab18, masterlist.Cat_Serie, masterlist.Cat_Kinder, masterlist.Cat_Comedy, masterlist.Cat_Krimi, masterlist.Cat_SiFi, masterlist.Cat_Fantasy, masterlist.Cat_Action, masterlist.Cat_Doku, masterlist.Cat_Anime, masterlist.Cat_Horror, masterlist.Cat_Sonstiges, masterlist.Cat_Porn, masterlist.Cat_Western, masterlist.Cat_Kampfsport, masterlist.Cat_Biographie, masterlist.Cat_Mystery, masterlist.Cat_Drama, masterlist.Cat_Thriller, masterlist.Status 
FROM masterlist JOIN videoliste 
ON (masterlist.Filmname = videoliste.Filmname) 
AND videoliste.BesitzerId = '1' 
AND videoliste.Filmname NOT IN ( 
SELECT DISTINCT videoliste.Videolist_Id, videoliste.Filmname, videoliste.Format, videoliste.DVDnummer, videoliste.Kommentar, videoliste.MeineBewertungsPunkte, videoliste.EintragsDatum, videoliste.BesitzerId, masterlist.Filmname, masterlist.GesamtbewertungsPunkte_Maenner, masterlist.GesamtbewertungsPunkte_Frauen, masterlist.AbgegebeneBewertungen_Maenner, masterlist.AbgegebeneBewertungen_Frauen, masterlist.Cat_Ab18, masterlist.Cat_Serie, masterlist.Cat_Kinder, masterlist.Cat_Comedy, masterlist.Cat_Krimi, masterlist.Cat_SiFi, masterlist.Cat_Fantasy, masterlist.Cat_Action, masterlist.Cat_Doku, masterlist.Cat_Anime, masterlist.Cat_Horror, masterlist.Cat_Sonstiges, masterlist.Cat_Porn, masterlist.Cat_Western, masterlist.Cat_Kampfsport, masterlist.Cat_Biographie, masterlist.Cat_Mystery, masterlist.Cat_Drama, masterlist.Cat_Thriller, masterlist.Status 
FROM masterlist JOIN videoliste 
ON (masterlist.Filmname = videoliste.Filmname) 
AND videoliste.BesitzerId = '3' ) 
ORDER BY videoliste.Filmname ASC, videoliste.Filmname
 
Zuletzt bearbeitet:
Doch, aber überleg bitte mal selbst was du in deiner Where Formulierung anders machst als in meinem Beispiel und wieso?

Was macht die Where Klausel eigentlich? In meinem Beispiel und in dem von dir geändertem.

Wenn du diese Fragen beantwortet hast, dann hast dein Problem gelöst ;)

Vorallem die Fehlermeldung ist sehr aussagekräftig und deutet auf den wichtigen Punkt hin.
 
Zurück