Mailinglisten-Archive |
----- Original Message ----- From: "Andreas Korinek" <info_(at)_bonsai-welt.de> To: <php_(at)_php-center.de> Sent: Sunday, June 18, 2000 5:16 PM Subject: [php] MySql-Abfrage > Hallo, > > ich habe folgendes Problem: > > in einer Datenbank liegt im Feld kat_id ein String, der aus max. 5 > Kommaseparierten Zahlen besteht, also z.B. 1,2,3,4,5 oder auch 11,4,71 > > Nun will ich eine Abfrage machen, die alle Reihen auswählt, die eine bestimmte > Zahl im Feld beinhalten. Das habe ich folgendermassen probiert: > > "select * from artikel where kat_id like $kat_id" > ($kat_id wird an das Script übergeben) > Das Problem ist, daß diese Query nie etwas zurückgibt, außerdem muß die Query > ja auch noch zwischen z.B. 1 und 11 und 14 unterscheiden, die ja alle gefunden > werden müßten. > > Hat jemand eine Idee, wie man das lösen könnte? > > > -- > Mit freundlichen Grüßen > > Andreas Korinek > > info_(at)_bonsai-welt.de > > -- > ** Durchgehend geöffnet: http://www.php-center.de ** > Die PHP-Liste: mailto:php_(at)_php-center.de > http://infosoc.uni-koeln.de/mailman/listinfo/php > Hi, Es ist zwar mehr oder weniger alles schon gesagt worden. Es gibt in Mysql den Datentyp SET der eine Liste von erlaubten Werten enthält die ein Feld annehmen kann (können auch mehrere sein), man kann auf dieses Feld mit FIND_IN_SET oder einer LIKE Abfrage zugreifen, der einzige Nachteil ist das Änderungen im SET, also der menge der erlaubten Werte, jedesmal einen ALTER TABLE erfordern. Was sich bei ständig änderden Kategorien als extrem schwierig erweist. Du solltest eher eine Veränderung deiner Datenbankstruktur in erwägung ziehen, dh. das Ding in die 3.te oder besser die DKNF bringen indem du die kategorien in einer weiteren Tabelle speicherst und die beiden resultierenden Tabellen über eine dritte Tabelle verknüpfts: zb.: # -------------------------------------------------------- # # Table structure for table 'kategorien' # CREATE TABLE kategorien ( kat_id int(11) NOT NULL auto_increment, kat_name varchar(255) NOT NULL, kat_beschreibung text, PRIMARY KEY (kat_id) ); # -------------------------------------------------------- # # Table structure for table 'produkte' # CREATE TABLE produkte ( prod_id int(11) NOT NULL auto_increment, prod_name varchar(255) NOT NULL, prod_beschreibung text, PRIMARY KEY (prod_id) ); # -------------------------------------------------------- # # Table structure for table 'verbindung_kat_prod' # CREATE TABLE verbindung_kat_prod ( kat_id int(11) NOT NULL, prod_id int(11) NOT NULL, PRIMARY KEY (kat_id, prod_id) ); In der Verbindungstabelle hast du einen zusammengesetzten Primärschlüssel aus kat_id und prod_id der zusammen immer UNIQUE ist damit du verhinderst das einem Produkt mehrmals die selbe kategorie zugeordnet wird. Der Vorteil ist das du relativ fexibel bist was deine Kategorien angeht (neue Kategorien, etc) und das die Performance relativ hoch ist. Wenn du eine Kategorie löscht, mußt du bei Mysql die Verknüpfung zwar manuell löschen da bislang noch keine (funktionsfähigen) FOREIGN KEYS implementiert sind. aber das ist relativ simpel. Ein Select wie oben beschrieben würde dann wie folgt aussehen: SELECT p.prod_id, p.prod_name, FROM produkte p, verbindung_kat_prod v WHERE p.prod_id=v.prod_id AND v.kat_id IN ($kat_1,$kat_2) GROUP BY p.prod_id Der SELECT muß nicht über alle Tabellen geführt werden wenn die weiteren Informationen in der Kategorientabelle nicht relevant sind, das Grouping über die Spalte prod_id verhindert doppelte Zeilen (man könnte auch noch eine COUNT Funktion benutzen um eine Relevanz zu ermitteln). Markus
php::bar PHP Wiki - Listenarchive