MySQL Abfrage über 2 Schlüssel

flashbanane

Grünschnabel
Hallo miteinander,

gerade arbeite ich an einen Datenbankentwurf der wie folgt aussieht.
Die Tabellen:

In Tabelle objekt stehen die Personendaten
In Tabelle hobbys stehen die Namen einiger Hobbys.
In Tabelle obj_hob wird gespeichert welche Person welche Hobbys hat
Code:
-- 
-- Tabellenstruktur für Tabelle `hobbys`
-- 

CREATE TABLE `hobbys` (
  `hob_id` mediumint(8) unsigned NOT NULL auto_increment,
  `hob_name` varchar(25) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`hob_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=9 ;

-- 
-- Daten für Tabelle `hobbys`
-- 

INSERT INTO `hobbys` (`hob_id`, `hob_name`) VALUES 
(1, 'Fussball'),
(2, 'Disco'),
(3, 'Kartenspiel'),
(4, 'Kochen'),
(5, 'Einkaufen'),
(6, 'Tischtennis'),
(7, 'Chat'),
(8, 'Schwimmen');

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `objekt`
-- 

CREATE TABLE `objekt` (
  `obj_id` mediumint(8) unsigned NOT NULL auto_increment,
  `obj_name` varchar(25) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`obj_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ;

-- 
-- Daten für Tabelle `objekt`
-- 

INSERT INTO `objekt` (`obj_id`, `obj_name`) VALUES 
(1, 'Anton'),
(2, 'Anne'),
(3, 'Berta'),
(4, 'Fritz'),
(5, 'Sabine'),
(6, 'Otto');

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `obj_hob`
-- 

CREATE TABLE `obj_hob` (
  `obj_id` mediumint(8) unsigned NOT NULL,
  `hob_id` mediumint(8) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- 
-- Daten für Tabelle `obj_hob`
-- 

INSERT INTO `obj_hob` (`obj_id`, `hob_id`) VALUES 
(1, 1),
(1, 3),
(1, 5),
(1, 7),
(2, 1),
(2, 2),
(2, 3),
(2, 4),
(3, 2),
(3, 4),
(3, 6),
(3, 8),
(4, 5),
(4, 6),
(4, 7),
(4, 8),
(5, 1),
(5, 3),
(5, 5),
(5, 7),
(6, 1),
(6, 2),
(6, 3),
(6, 4);

Wenn ich nun wissen will welche Person welche Hobbys hat erstelle ich folgende Abfrage:
Code:
SELECT hob_name
FROM obj_hob, hobbys
WHERE obj_hob.hob_id = hobbys.hob_id
AND obj_id = '1'
So weit so gut

Nun will ich eine Abfrage erstellen die alle Personen listet die eine Übereinstimmung der Abgefragten Hobbys hat.

Erst habe ich folgende Abfrage erstellt
Code:
SELECT obj_name, hob_name
FROM objekt, hobbys, obj_hob
WHERE objekt.obj_id = obj_hob.obj_id
AND obj_hob.hob_id = hobbys.hob_id
AND (
obj_hob.hob_id = '1'
OR obj_hob.hob_id = '2'
)
Das Ergebnis zeigt aber alle Personen die entweder das Hobby mit der hob_id 1 oder 2 haben.
Ich will aber eine Übereinstimmung mit beiden Hobbys haben. Ich habe dann diese Abfrage getestet, was aber ein leeres Resultat ergibt.
Code:
SELECT obj_name, hob_name
FROM objekt, hobbys, obj_hob
WHERE objekt.obj_id = obj_hob.obj_id
AND obj_hob.hob_id = hobbys.hob_id
AND (
obj_hob.hob_id = '1'
AND obj_hob.hob_id = '2'
)
Wie soll ich vorgehen, um die Personen zu ermitteln welche bei den Hobbys eine exakte Übereinstimmung haben?

lg
 
Hallo miteinander,

HAVING COUNT() ist die Lösung die ich brauchte. Hat wunderbar geklappt.
Wenn der COUNT gleich mit der Anzahl der Abgefragten Hobbys ist müssen die Übereinstimmungen gleich sein.

Habe es jetzt für mich so verwendet da das ganze ein Teil einer größeren Abfrage ist.

Code:
SELECT obj_name
FROM objekt, obj_hob
WHERE objekt.obj_id = obj_hob.obj_id
AND (
obj_hob.hob_id = '1'
OR obj_hob.hob_id = '2'
)
GROUP BY obj_hob.obj_id
HAVING COUNT( obj_hob.obj_id ) =2

lg
 
Zurück