phpbar.de logo

Mailinglisten-Archive

[php] MySql-Abfrage

[php] MySql-Abfrage

Markus Seifert seifert_(at)_ag-neuemedien.de
Mon, 19 Jun 2000 12:21:58 +0200


----- 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