Einträge finden die in tabelle _nicht_ vorkommen

Puh ich hab ein blödes Problem hier.
Ich arbeite momentan mit MySQL 4.1.irgendwas

Ich habe zwei tables einer hält die daten, der zweite hält die felddefinitionen.

CREATE TABLE data (
uid int(11) NOT NULL auto_increment,
pl_id int(11) NOT NULL default ‚0‘,
typ_id int(11) NOT NULL default ‚0‘,
data mediumtext NOT NULL
) TYPE=MyISAM;

Inhalt des tables:

uid pl\_id typ\_id data
1 5 1 bla
2 5 3 blubb
3 5 4 narf
4 6 1 gnorf

CREATE TABLE fieldtypes (
uid int(11) NOT NULL auto_increment,
name varchar(200) NOT NULL default ‚‘,
datatype enum(‚varchar‘,‚text‘,‚int‘,‚double‘,‚enum‘,‚undefined‘) NOT NULL default ‚undefined‘
) TYPE=InnoDB;

Inhalt des tables:

uid name datatype
1 str varchar
2 name varchar
3 plz int
4 ort varchar

data und fieldtypes sind also n:m über data.typ_id und fieldtypes.uid verknüpft.
Ein Datensatz macht sich immer an data.pl_id fest, also alle zeilen aus data die z.B. pl_id = 5 haben ergeben einen Datensatz für den User.

Wenn ich also ein „SELECT * FROM data WHERE pl_id = 5“ bekomme ich nur die daten, also brauche ich im grunde immer ein „SELECT d.*, t.* FROM data AS d, fieldtypes AS t WHERE d.typ_id = t.uid AND d.pl_id = 5“.

Jetzt bekomme ich aber natürlich nur die Felder, die auch wirklich in der DB eingetragen wurden, im fall von data.pl_id = 5 fehlt ein eintrag für fieldtypes.uid = 2.
So wie bekomme ich die jetzt raus? Also ich will ein Select machen der mir alle Zeilen aus datatypes zurückgibt, die für eine bestimmte pl_id im data table nicht vorkommen.
Ich hab schon ewig mit JOIN, UNION, IN und GROUP BY rumgespielt, aber irgendwie kam immer Mist dabei heraus.

Über jede konstruktive Antwort (auch wenn die lautet wie ich mein DB-design umbauen muß um überhaupt etwas sinnvolles zu haben) bin ich sehr dankbar!

Hi!

So wie bekomme ich die jetzt raus? Also ich will ein Select
machen der mir alle Zeilen aus datatypes zurückgibt, die für
eine bestimmte pl_id im data table nicht vorkommen.
Ich hab schon ewig mit JOIN, UNION, IN und GROUP BY
rumgespielt, aber irgendwie kam immer Mist dabei heraus.

Gibt’s in MySQL ein „NOT IN“ (a la „select x from tab1 where y not in (select z from tab2“)

Ansonsten könnte auch ein Outer-Join helfen; ANSI-Standard ist nicht meins und mit der Oracle-Notation kommst Du in MySQL wahrscheinlich nicht weiter; jedenfalls ver"outerjoine" die beiden Tabellen und prüfe eines der nicht-Vorkommfelder auf NULL ab

So, verwirrt genug?

Grüße,
Tomh

Gibt’s in MySQL ein „NOT IN“ (a la „select x from tab1 where y
not in (select z from tab2“)

Ja das gibts, aber ich bin nicht drauf gekommen das man im IN einen neuen Select machen kann *narf*

Also ein
SELECT * FROM fieldtypes WHERE uid NOT IN (SELECT type_id FROM data WHERE pl_id = 5)

bringt genau das was ich wollte.
Vielen Dank!

Ansonsten könnte auch ein Outer-Join helfen; ANSI-Standard ist
nicht meins und mit der Oracle-Notation kommst Du in MySQL
wahrscheinlich nicht weiter; jedenfalls ver"outerjoine" die
beiden Tabellen und prüfe eines der nicht-Vorkommfelder auf
NULL ab

Das mit dem OUTER JOIN hab ich mir nach 10 Minuten MySQL Doku auch gedacht, aber das hatte einen Haken: wenn ich die beiden Tables so wie sie sind vergleichen wollte, ging das wunderbar, wenn ich aber noch die bedingung hatte das es nur von einem Teil der Daten aus dem Table „data“ haben wollte, kam nurnoch Mist raus. Also meine Versuche sahen so aus:

SELECT * FROM fieldtypes LEFT OUTER JOIN data ON data.typ_id = fieldtypes.uid WHERE data.pl_id IS NULL

Das verlgeicht eben die ganze Tabelle (und dauert eklige 1,3 sekunden) und weiter wüßte ich nicht wie ich den query bauen könnte um das jetzt noch auf meinen pl_id = 5 ausdehnen könnte.

naja der erste Tipp hat ja prima funktioniert, vielen Dank nochmal dafür!

Hi,
kauf dir ne Schreckschusspistole, ‚erschieß‘ damit den, der das Antidesign verbrochen hat und sag ihm, beim nächsten mal nimmst du ne richtige.

Dann ersetze dein vorhandenes Design, durch folgendes: (EINE Tabelle
mit den folgenden Spalten:

name datatype
str varchar
name varchar
plz int
ort varchar

Dann ziehst du den der das Design verbrochen hat, an den Ohren herbei und zwingst ihn 10h Heino zu hören, oder die von dir erzeugt Tabelle mit den Daten aus seinem Bockmist zu füllen.

Anschließend geht ihr dann gemeinsam ein Bier trinken, damit die Stimmung im Betrieb wieder stimmt.

Jens

PS: Alles bis auf das mit der Schreckschusspistole ist ernst gemeint

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]