MySQL -> Wie werte ich die Beziehungen richtig aus?
Georg
- datenbank
0 Matthias Apsel1 hotti0 Georg0 hotti0 Matthias Apsel
Hallo,
ich sehe irgendwie den Wald vor lauter Bäumen nicht mehr...
Ich habe 5 Tabellen:
Gruss
Georg
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
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
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
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.
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.
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
MfG
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
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
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