Werte finden die nicht vorhanden sind?
WernerK
- datenbank
Hallo,
das Thema hört sich vermutlich komisch an.
Eine MySQL Tabelle "jobs" hat die Spalten
ID,JobID, JobName, JobValue
Alle Einstellungen eines Auftrag werden anhand der JobID zusammengefasst
Ein Beispiel:
JobID, JobName, JobValue
1 Farbe rot
1 Auto Ford
1 User Karl
1 Alter 30
1 StatusID 1
2 Farbe blau
2 Auto VW
...
Es gibt Standardwerte für die Spalte JobName die immer vorkommen.
Der Wert "StatusID" mit dem JobValue = 1 kommt aber nur vor, wenn der Auftrag auch richtig abgeschlossen wurde.
Jetzt würde ich gerne alle Aufträge herausbekommen bei denen JobName = Status fehlt?
Wenn man ein Select wie;
SELECT * FROM jobs WHERE JobName != 'StatusID'
macht, bringt das ja nicht das Ergebnis weil dann ja alle anderen Zeilen aufgelistet werden.
Ich möchte eigentlich nur die JobID herausbekommen bei der die StatusID fehlt, deren Auftrag also nicht abgeschlossen wurde.
Kann mir jemand einen Hinweis geben?
Gruss
Werner
Kann mir jemand einen Hinweis geben?
Spontan würde ich sagen, mit einem Self-Join.
Hallo
Spontan würde ich sagen, mit einem Self-Join.
Danke dir aber genau das hatte ich auch gefunden und probiert
aber irgendwie hat es nicht das Ergebnis gebraucht wie ich wünschte.
Gruss
Werner
Irgendwie klappt es nicht
Jetzt habe ich versucht mit einem Subselect zum ergebnis zu kommen.
SELECT JobID FROM jobs AS KK1
WHERE KK1.JobName = 'JobStatusID'
GROUP BY KK1.JobID
liefert mir ja alle JobID s wo acuh "JobStatusID" vorkommt.
Wenn ich nun dieses Ergebnis in einen SubSelect einbauen will:
SELECT JobID FROM jobs WHERE JobID = (
SELECT JobID FROM jobs AS KK1
WHERE KK1.JobName = 'JobStatusID'
GROUP BY KK1.JobID )
dann kommt ein Fehler:
1242 - Subquery returns more than 1 row
Bin für jeden Tipp dankbar
Gruss
Werner
Hallo Werner,
handelt es bei JOBS um eine bereits bestehende womöglich riesige Tabelle im Verbund mit zig anderen riesigen Tabellen? Oder ist das ein Neuentwurf?
Ich verstehe nicht, warum die Tabelle so merkwürdig aufgebaut ist. Weil so lässt sich meines Wissens tatsächlich nicht so leicht finden wonach Du suchst:
"Finde die DatensatzID, zu der zwar mindestens 1 Datensatz existiert, dessen Feld JobName NICHT den Wert 'StatusID' hat und zu der außerdem KEIN Datensatz existiert, dessen Feld Jobname den Wert 'StatusID' hat."
Das sind für mich definitiv 2 Abfragen.
Ansonsten - falls die Tabelle eine Neuentwicklung ist, schlage ich dieses Design vor:
JobID, Farbe, Auto, User, Alter, StatusID
Falls aber tatsächlich Anzahl und Bezeichnung für die Werte für "JobName" variabel sein soll, dann mach daraus 3 Tabellen: JOBS, JOBDETAILS, JOB_JOBDETAIL
Gruß vom foomaker
Hallo foomaker,
Ich verstehe nicht, warum die Tabelle so merkwürdig aufgebaut ist. Weil so lässt sich meines Wissens tatsächlich nicht so leicht finden wonach Du suchst:
vielen Dank auch für deine Hilfe.
Nun es war nur ein Beispiel mit "Auto" und Farbe.
Vielmehr ist es so das die Tabelle Formulardaten im Prinzip einen Auftrag erfasst. Ein Anwender kann über verschiedene Reiter /Tabs sehr viele unterschiedliche Einstellungen wählen und speichern. Jede checkbox und jeder Radiobutton oder Select hat ja eine eigene Bezeichnung und Wert.
Daher der Aufbau
ID,JobID, JobName, JobValue
Im Normalfall brauche ich die erwähnte Suche nach dem "nicht vorhandenen" Wert nicht. Ich wollte vielmehr zum testen herausfinden welche JobIDs nicht abgeschlossen wurden, wo also der JobName "JobStatusID" nicht vorkommt.
Alle Aufträge werden dann später anhand der eindeutigen JobID angezeigt. Aber halt nur die die abgeschlossen sind mit "JobStatusID = 1"
trotzdem vielen Dank
Gruss
Werner
Hallo,
» Spontan würde ich sagen, mit einem Self-Join.
Danke dir aber genau das hatte ich auch gefunden und probiert
aber irgendwie hat es nicht das Ergebnis gebraucht wie ich wünschte.
falls Du einen Selfjoin nutzt, benötigst Du einen LEFT JOIN. Die Joinbedingung prüft nicht nur Gleichheit der ID, Du prüfst mit IS NULL den Wert von JobName und JobValue.
Grundsätzlich rate ich Dir hier zu einem leichter verständlichen Subselect
...
WHERE JobID NOT IN -- wobei sich die JobID nicht in
(
SELECT -- der Liste der JobIDs befindet
JobID
FROM -- deren
jobs -- Job
WHERE -- bereits beendet ist
JobName = StatusID
AND
JobValue = 1
)
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
danke dir sehr für deine gute erklärung und Hilfe.
Grundsätzlich rate ich Dir hier zu einem leichter verständlichen Subselect
Genau so mit Subselect und NOT IN habe ich es hinbekommen.
Klasse und vielen Dank
Gruss
Werner