Klaus Mock: Eigenschaften zählen und vergleichen mit MySQL

Beitrag lesen

Hallo,

Ich kann mir das so vorstellen, daß Du mit drei Tabellen arbeitest:

Tabelle Personen:
personen_id [Primärschlüssel]
name
vorname
...
Beispiel:
1,Huber,Hans
2,Müller,Anita
3,Maier,Franz

Tabelle Eigenschaften
eigenschafts_id [Primär-Schlüssel]
bezeichnung
...
Beispiel:
1,Schach
2,Musik
3,Tanzen
4,Tennis

Tabelle Personeneigenschaften:
personen_id      [Primärschlüssel]
eigenschafts_id  [Primärschlüssel]
(Beide Felder zusammen sollten u.a. deshalb den Primärschlüssel bilden, damit Du doppelte Einträge vermeidest)

Beispiel
1,1
1,2
2,3
3,2
3,3
3,4

Mit einer Anweisung wie

SELECT p.name,p.vorname,count(e.eichenschafts_id)
  FROM personen p, eigenschaften e, personen_eigenschaften ep
  WHERE p.personen_id = ep.personen_id
    AND e.eigenschafts_id = ep.eigenschafts_id
    AND e.bezeichnung IN ('Schach','Musik')
  GROUP BY p.name,p.vorname

würdest Du alle Personen finden, welche mindestens eine der angegebenen Eigenschaften haben.
Performanter würde das sein, wenn Du schon vorher die Eigenschaften an deren ID's bestimmen kannst ( Wie etwa durch ein geeignetes Auswahlfeld).

SELECT p.name,p.vorname,count(ep.eichenschafts_id)
  FROM personen p, personen_eigenschaften ep
  WHERE p.personen_id = ep.personen_id
    AND ep.eigenschafts_id IN (1,2)
  GROUP BY p.name,p.vorname

Es gehen dann auch andere Spielarten von Abfragen, aber so im wesentlichen ist das sicherlich eine recht flexible Lösung, so denke ich zumindest.

Alternativ, falls Dir das zu kompliziert erscheint, kannst Du auch der Personen-Tabelle ein Feld für die Eigenschaften verpassen.
Beispiel:
1,Huber,Hans,Schach Musik
2,Müller,Anita,Tanzen
3,Maier,Franz,Musik Tanzen Tennis

Und das so abfragen

SELECT name, vorname
   FROM personen
   WHERE eigenschaften LIKE '%Schach%'
      OR eigenschaften LIKE '%Musik%'

Aber das hat doch einige Nachteile, wie etwa daß die Anzahl der Hobbies durch die Größe des Feldes eigenschaften begrenzt ist ( bei char-Feldern i.d.R 255 Zeichen), oder es keine vernünftige Möglcihkeiten gibt, anhand der Anzahl der gefundenen Eigenschaften pro Person eine Reihung durchzuführen (best fit), und noch vieles mehr.

Anmerkung: Mir ist schon klar, daß einige (viel) Datenbanken auch mit JOIN umgehen können, und daruch auch performanter sein können, aber die obigen Abfragen sind so halbwegs datenbankneutral.

Mir sind da sicherlich noch einige wirklcih wichtige Dinger nicht eingefallen, aber fürs erste hoffe ich, Dir eine Ausgangsabasis für weiter Gedanken vermittelt zu haben

Grüße
  Klaus