Einzelnen Beitrag anzeigen
Alt 16.10.2008, 14:41  
stefanjann
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard Nochmal von vorne

Ok, irgendwie drehen wir uns hier immer in Kreis. Jetzt mal ordentliche Strukturdaten zum nachtesten:
Code:
    
CREATE TABLE IF NOT EXISTS `kategorie` (
  `ident` bigint(20) unsigned NOT NULL auto_increment,
  `kat` varchar(25) collate utf8_bin NOT NULL default '',
  PRIMARY KEY  (`ident`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=6 ;

INSERT INTO `kategorie` (`ident`, `kat`) VALUES
(1, 'Frauenchor'),
(2, 'Kinderchor'),
(3, 'Jugendchor'),
(4, 'Jugendorchester'),
(5, 'Jugendblaskapelle');

CREATE TABLE IF NOT EXISTS `person` (
  `ident` bigint(20) unsigned NOT NULL auto_increment,
  `person` varchar(50) collate utf8_bin NOT NULL default '',
  PRIMARY KEY  (`ident`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=7 ;

INSERT INTO `person` (`ident`, `person`) VALUES
(1, 'Hans'),
(2, 'Franz'),
(3, 'Sepp'),
(4, 'Gerald'),
(5, 'Markus');

CREATE TABLE IF NOT EXISTS `personzukat` (
  `zuperson` bigint(20) unsigned NOT NULL default '0',
  `zukat` bigint(20) unsigned NOT NULL default '0',
  KEY `zuperson` (`zuperson`,`zukat`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `personzukat` (`zuperson`, `zukat`) VALUES
(1, 3),
(1, 4),
(2, 4),
(2, 5),
(3, 2),
(4, 3),
(4, 5),
(5, 2),
(5, 4),
(5, 5);
Die Anforderung ist: Gib mir alle die in irgendwas mit "jugend" sind aber kein "chor" sind:
Code:
SELECT *
  FROM person p
  INNER JOIN personzukat z1
    ON z1.zuperson = p.ident
  INNER JOIN kategorie k1
    ON k1.ident = z1.zukat
  INNER JOIN personzukat z2
    ON z2.zuperson = p.ident
  LEFT JOIN kategorie k2
    ON k2.ident=z2.zukat AND k2.kat LIKE '%chor%'
  WHERE LOWER(k1.kat) LIKE '%jugend%'
    AND k2.ident IS NULL
Ergebnis:
Code:
ident | person | zuperson | zukat | ident | kat               | zuperson | zukat | ident | kat
1     | Hans   | 1        | 3     | 3     | Jugendchor        | 1        | 4     | NULL  | NULL
1     | Hans   | 1        | 4     | 4     | Jugendorchester   | 1        | 4     | NULL  | NULL
2     | Franz  | 2        | 4     | 4     | Jugendorchester   | 2        | 4     | NULL  | NULL
2     | Franz  | 2        | 4     | 4     | Jugendorchester   | 2        | 5     | NULL  | NULL
2     | Franz  | 2        | 5     | 5     | Jugendblaskapelle | 2        | 4     | NULL  | NULL
2     | Franz  | 2        | 5     | 5     | Jugendblaskapelle | 2        | 5     | NULL  | NULL
4     | Gerald | 4        | 3     | 3     | Jugendchor        | 4        | 5     | NULL  | NULL
4     | Gerald | 4        | 5     | 5     | Jugendblaskapelle | 4        | 5     | NULL  | NULL
5     | Markus | 5        | 4     | 4     | Jugendorchester   | 5        | 4     | NULL  | NULL
5     | Markus | 5        | 4     | 4     | Jugendorchester   | 5        | 5     | NULL  | NULL
5     | Markus | 5        | 5     | 5     | Jugendblaskapelle | 5        | 4     | NULL  | NULL
5     | Markus | 5        | 5     | 5     | Jugendblaskapelle | 5        | 5     | NULL  | NULL
Finden sollte er nur: Franz! Denn alle anderen haben eine Kategorie mit %chor%.
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten