WernerK: Werte finden die nicht vorhanden sind?

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

  1. Kann mir jemand einen Hinweis geben?

    Spontan würde ich sagen, mit einem Self-Join.

    1. 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

      1. 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

        1. 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

          --
          Natürlich glaube ich an die Existenz von Ausserirdischen. Schliesslich gibt es ja auch das PERFEKTE SCRIPT.
          1. 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

      2. 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

        1. 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