Georg: MySQL -> Wie werte ich die Beziehungen richtig aus?

Hallo,

ich sehe irgendwie den Wald vor lauter Bäumen nicht mehr...
Ich habe 5 Tabellen:

  • qualifikation
  • mitarbeiter
  • auftrag
  • rl_mitarbeiter
  • rl_auftrag
    In den RL-Tabellen bilde ich anhand der jw. IDs Relationen zwischen Qualifikation und Mitarbeiter sowie Qualifikation und Auftrag ab.
    Jetzt möchte ich anhand einer Auftrags-ID alle relevanten Mitarbeiter herausfinden, d.h. ich muss die Verbindung:
    Auftrag -> Benötigte Qualifikationen -> Mitarbeiter mit entsprechenden Qualifikationen
    herstellen.
    Soweit, sogut. Leider stehe ich aber gerade sowas von nebenmir das ich das einfach nicht hinbekomme - also hoffe ich hier auf ein wenig Unterstützung (das ich das mit JOINs lösen sollte weiss ich, nur irgendwie komme ich nicht drauf...).
    Ich bitte zu beachten, das der MA ALLE(!) Qualifikationen erfüllen muss (also ein IN... scheidet aus).

Gruss
Georg

  1. Om nah hoo pez nyeetz, Georg!

    Soweit, sogut. Leider stehe ich aber gerade sowas von nebenmir das ich das einfach nicht hinbekomme - also hoffe ich hier auf ein wenig Unterstützung (das ich das mit JOINs lösen sollte weiss ich, nur irgendwie komme ich nicht drauf...).
    Ich bitte zu beachten, das der MA ALLE(!) Qualifikationen erfüllen muss (also ein IN... scheidet aus).

    Dann solltest du Beispieldaten zur Vefügung stellen. Das gibts auch online.

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Feme und Femen.

    1. Om nah hoo pez nyeetz, Georg!

      Soweit, sogut. Leider stehe ich aber gerade sowas von nebenmir das ich das einfach nicht hinbekomme - also hoffe ich hier auf ein wenig Unterstützung (das ich das mit JOINs lösen sollte weiss ich, nur irgendwie komme ich nicht drauf...).
      Ich bitte zu beachten, das der MA ALLE(!) Qualifikationen erfüllen muss (also ein IN... scheidet aus).

      Dann solltest du Beispieldaten zur Vefügung stellen. Das gibts auch online.

      Matthias

      Huppsss,

      doch wohl zu kompliziert ausgedrückt....
      Also wie gesagt, ich habe 5 Tabellen:

      qualifikation
      --------------------
      qualifikation_id
      bezeichner

      mitarbeiter
      --------------------
      mitarbeiter_id
      bezeichner

      auftrag
      --------------------
      auftrag_id
      bezeichner

      rl_mitarbeiterqualifikation
      --------------------
      mitarbeiter_id
      qualifikation_id

      rl_auftragqualifikation
      --------------------
      auftrag_id
      Qualifikation_id

      Bei obigen Aufbau speichere ich in der Tabelle "qualifikation" mögliche Qualifikationsmerkmale, in der Tabelle "mitarbeiter" Mitarbeiterdaten jw. eines einzelnen Mitarbeiters und in der Tabelle "auftrag" jw. Daten eines einzelnen Auftrages.

      Jeder Auftrag hat hierbei eine unterschiedliche Anzahl von möglichen Qualifikationen, eine entsprechende Zuweisung löse ich über die Tabelle "rl_auftragqualifikation". Da ja auch jeder Mitarbeiter Qualifikationen hat, verwende ich hierfür ebenfalls eine Tabelle, die "rl_mitarbeiterqualifikation".

      Meine konkrete Frage hierzu ist, wie ich anhand einer gegebenen Auftrags-ID alle passenden Mitarbeiter herausfinden kann (Kriterium ist hierbei gleiche oder mehr Qualifikation seitens des Mitarbeiters in Bezug auf den Auftrag).

      Wer das ganze mal in der DB probieren will, hier eine (stark eingekürzte) SQL:

        
      --  
      -- Tabellenstruktur für Tabelle `db_auftrag`  
      --  
        
      CREATE TABLE IF NOT EXISTS `db_auftrag` (  
        `id` int(50) NOT NULL AUTO_INCREMENT,  
        `bezeichner` varchar(50) NOT NULL,  
        PRIMARY KEY (`id`)  
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;  
        
      --  
      -- Daten für Tabelle `db_auftrag`  
      --  
        
      INSERT INTO `db_auftrag` (`id`, `bezeichner`) VALUES  
      (1, 'Testauftrag 1');  
        
      -- --------------------------------------------------------  
        
      --  
      -- Tabellenstruktur für Tabelle `db_mitarbeiter`  
      --  
        
      CREATE TABLE IF NOT EXISTS `db_mitarbeiter` (  
        `id` int(200) NOT NULL AUTO_INCREMENT,  
        `bezeichner` varchar(50) NOT NULL,  
        PRIMARY KEY (`id`)  
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;  
        
      --  
      -- Daten für Tabelle `db_mitarbeiter`  
      --  
        
      INSERT INTO `db_mitarbeiter` (`id`, `bezeichner`) VALUES  
      (1,'Paul Panzer', 1),  
      (2,'Michael Müller', 1),  
      (3,'Kai Hummel', 1);  
        
      -- --------------------------------------------------------  
        
      --  
      -- Tabellenstruktur für Tabelle `db_qualifikation`  
      --  
        
      CREATE TABLE IF NOT EXISTS `db_qualifikation` (  
        `id` int(20) NOT NULL AUTO_INCREMENT,  
        `bezeichnung` varchar(150) NOT NULL,  
        PRIMARY KEY (`id`)  
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;  
        
      --  
      -- Daten für Tabelle `db_qualifikation`  
      --  
        
      INSERT INTO `db_qualifikation` (`id`, `bezeichnung`) VALUES  
      (1, 'FSK III'),  
      (2, 'Schweisserschein'),  
      (3, 'FSK II'),  
      (4, 'Akkord');  
        
      -- --------------------------------------------------------  
        
      --  
      -- Tabellenstruktur für Tabelle `rl_atqu`  
      --  
        
      CREATE TABLE IF NOT EXISTS `rl_atqu` (  
        `id` int(250) NOT NULL AUTO_INCREMENT,  
        `atid` int(20) NOT NULL,  
        `quid` int(20) NOT NULL,  
        PRIMARY KEY (`id`)  
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;  
        
      --  
      -- Daten für Tabelle `rl_atqu`  
      --  
        
      INSERT INTO `rl_atqu` (`id`, `atid`, `quid`) VALUES  
      (1, 1, 4),  
      (2, 1, 3);  
        
      -- --------------------------------------------------------  
        
      --  
      -- Tabellenstruktur für Tabelle `rl_maqu`  
      --  
        
      CREATE TABLE IF NOT EXISTS `rl_maqu` (  
        `id` int(250) NOT NULL AUTO_INCREMENT,  
        `maid` int(20) NOT NULL,  
        `quid` int(20) NOT NULL,  
        PRIMARY KEY (`id`)  
      ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;  
        
      --  
      -- Daten für Tabelle `rl_maqu`  
      --  
        
      INSERT INTO `rl_maqu` (`id`, `maid`, `quid`) VALUES  
      (1, 1, 3),  
      (2, 2, 4),  
      (5, 2, 2),  
      (6, 3, 2);  
      
      

      Ich hoffe das war diesmal verständlicher.

      Gruss
      Georg

      1. Kleiner Nachtrag:

        SELECT db_mitarbeiter.id,db_mitarbeiter.personalid,db_mitarbeiter.eintritt,db_mitarbeiter.vorname,db_mitarbeiter.nachname,db_mitarbeiter.status FROM db_mitarbeiter JOIN rl_maqu ON db_mitarbeiter.id = rl_maqu.maid WHERE rl_maqu.quid IN(SELECT quid FROM rl_atqu WHERE atid = '1') GROUP BY db_mitarbeiter.id

        Das war mein bsiheriger Versuch, der liefert mir aber logischerweise nicht ein korrektes Ergebnis (IN ist ja leider kein "MUST HAVE")...

        Gruss
        Georg

        1. IN ist ja leider kein "MUST HAVE"

          Auf eine Art ist es das schon. Es muss ja ein Wert IN einer Wertemenge sein.
          Du willst aber was anderes, nicht nur der Wert der aktuellen Zeile für sich muss in der Menge sein, sondern es müssen alle Kriterien erfüllt sein. Das lässt sich nicht mehr unabhängig zeilenweise abbilden.

    2. Also ich hab das so verstanden, es gibt eine Tabelle
      Auftrag 1 - benötigt Qualifikation 1
      Auftrag 1 - benötigt Qualifikation 2
      Auftrag 1 - benötigt Qualifikation 3

      und eine Tabelle

      Mitarbeiter 1 - hat Qualifikation 1
      Mitarbeiter 1 - hat Qualifikation 3
      Mitarbeiter 2 - hat Qualifikation 1
      Mitarbeiter 2 - hat Qualifikation 2
      Mitarbeiter 2 - hat Qualifikation 3
      Mitarbeiter 3 - hat Qualifikation 1
      Mitarbeiter 3 - hat Qualifikation 2
      Mitarbeiter 3 - hat Qualifikation 4

      Jetzt will er alle Mitarbeiter finden die alle Qualifikationen zu einem bestimmten Auftrag erfüllen. Zu Auftrag 1 also Mitarbeiter 2.
      Ich hab daran ne Weile überlegt, aber ohne eklig viele dynamische JOINS komm ich da bisher auf keinen Vorschlag.

  2. Hi,

    evntl. hilft Dir ein Bewertungssystem. Es wird dual, wenn eine bestimmte Fähigkeit (Skill) genau zwei Zustände kennt: Vorhanden||Nicht vorhanden, 1 oder 0.

    Z.B. sowas:
    Skill     => Bwertung  => Wert für Zustand 1
    --------------------------------------------
    Reden     => 0         => 2^0 => 1
    Lesen     => 1         => 2^1 => 2
    Schreiben => 2         => 2^2 => 4

    Für den Bewertungsschlüssel wird einfach nur aufsummiert, so hätten wir:
    7) kann Lesen, Schreiben und Reden (alles)
    6) kann Lesen und Schreiben
    5) kann Schreiben und Reden
    4) kann Schreiben
    3) kann Reden und Lesen
    2) kann Lesen

    1. kann Reden

    MfG

    1. Hallo nochmal,

      evntl. hilft Dir ein Bewertungssystem. Es wird dual, wenn eine bestimmte Fähigkeit (Skill) genau zwei Zustände kennt: Vorhanden||Nicht vorhanden, 1 oder 0.

      nein, leider geht das nicht.

      Das Problem hierbei wäre das die Qualifikationen anhand Ihrer IDs identifiziert werden, was zur Folge hätte das z.B. die Anforderung "Qualifikation mit ID 2 und 7" das gleiche ergeben würde die Anforderung "Qualifikation 3 und 6".

      Da ich in dieser Sache ziemlich unter Zeitdruck stehe, versuche ich derzeit die Lösung über Arrays und Array-Vergleiche, hier stehe ich allerdings vor dem unschönen Problem das ich faktisch die zweite Ebene eines mehrdimensionalen Array mit einem Arrayinhalt vergleichen müsste - auch hier habe ich ein Brett vorm Kopf (es ist grausam soetwas unter Zeitdruck hinzubügeln).

      Für alle die die mein Array-Problem interessiert:
      Ich habe zwei Arrays, das erste ist eindimensional (kann aber beliebig angepasst werden) und enhalt lediglich den Wert "1" an der entsprechenden Position (Qualifikation-ID), also:
      $need[Qualifikations-ID] = '1';
      Das zu vergleichende Array ist zweidimensional und ist folgendermassen aufgebaut:
      $ma_array[Mitarbeiter-ID][Qualifikations-ID] = '1';
      Jetzt müsste ich halt einen Abgleich schaffen, der in der Art folgendes macht:
      WENN [ALLE NEED-WERTE] = MÖGLICHE MITARBEITER[MITARBEITER-ID][Qualifikation-ID] DANN ERGEBNIS-ARRAY[] = MITARBEITER-ID;

      Gruss
      Georg

      1. hi,

        Das Problem hierbei wäre das die Qualifikationen anhand Ihrer IDs identifiziert werden, was zur Folge hätte das z.B. die Anforderung "Qualifikation mit ID 2 und 7" das gleiche ergeben würde die Anforderung "Qualifikation 3 und 6".

        Logisch, wenn alle Skills dieselbe Wichtung haben. Ebendiese Wichtung muss bei Dir noch vorgenommen werden, dann ist die Zuordnung zur Summe eindeutig.

        MfG

      2. Om nah hoo pez nyeetz, Georg!

        evntl. hilft Dir ein Bewertungssystem. Es wird dual, wenn eine bestimmte Fähigkeit (Skill) genau zwei Zustände kennt: Vorhanden||Nicht vorhanden, 1 oder 0.

        nein, leider geht das nicht.

        Das Problem hierbei wäre das die Qualifikationen anhand Ihrer IDs identifiziert werden, was zur Folge hätte das z.B. die Anforderung "Qualifikation mit ID 2 und 7" das gleiche ergeben würde die Anforderung "Qualifikation 3 und 6".

        Dafür sind IDs ja auch da. Füge eine zusätzliche Spalte in die Qualifikationentabelle ein, die du mit Zweierpotenzen befüllst.

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen HAL und Halsbandarassari.