SELECT LIKE mit zweistelligen Zahlen

stega

Erfahrenes Mitglied
Einen wunderschönen guten Tag,

ich brauche mal wieder eure Hilfe, weil Google nichts Passendes ausspuckt.

Folgendes Szenario:
Ich habe eine Datenbank mit einer Tabelle, in der eine Menge Datensätze drin stehen. Diese Datensätze enthalten jeweils eine Frage mit Antwort und dann ein Feld, zu welcher Kategorie ('category') diese Frage gehört. Da eine Frage zu mehreren Kategorien gehören kann, steht bei einigen nicht nur eine Zahl in diesem 'category'-Feld, sondern dann z.B. 'frage', 'antwort', '12,20,32' - also zu 3 Kategorien gehörend.

Jetzt habe ich eine mysql-Abfrage, die mir die Fragen nach Kategorie aufgelistet ausgeben soll:

PHP:
$query = "SELECT * FROM questions  WHERE category LIKE '%".$c."%''";

Das Problem: wenn $c z.B. im oben stehenden Beispiel eine 2 ist, dann werden nicht nur die zu Kategorie 2 gehörenden Fragen angezeigt, sondern auch alle anderen, die eine 2 beinhalten - also auch die oben genannte Frage.

Kann mir jemand sagen, wie ich meine Suchanfrage so umstellen kann, dass ich wirklich nur die Fragen bekomme, die die angeklickte Kategorie $c beinhaltet?

(ich kann die Datenbank leider nicht umbauen, weil über 4000 Fragen drin stehen und ich sie nachträglich nicht normalisieren kann).

Wäre super, wenn jemand wüsste, wie ich das umsetzen kann,

vielen Dank schonmal,

liebe Grüßle
 
Du kannst REGEXP benutzen.
Damit kenne ich mich aber (nocht ;))nicht so gut aus. Aber ich denke, dass müsste damit zu lösen sein.
 
Zuletzt bearbeitet:
ok, danke für den Hinweis. Weiß jemand, wie ich das mit REGEXP lösen kann (da ich mich damit auch nicht auskenne ;) )
 
Hallo stega,

man braucht nicht unbedingt reguläre Ausdrücke:
SQL:
SELECT *
FROM questions
WHERE category = '$c'
   OR category LIKE '$c,%'
   OR category LIKE '%,$c,%'
   OR category LIKE '%,$c'

(ich kann die Datenbank leider nicht umbauen, weil über 4000 Fragen drin stehen und ich sie nachträglich nicht normalisieren kann).
Die Anzahl der Datensätze ist erst mal kein Argument gegen Normalisierung (eher für). Ich würde dir jedenfalls dringend dazu raten.

Grüße,
Matthias
 
REGEXP ist mächtig, doch geht das auch einfacher, da eine kommaseparierte Liste ein SET darstellt.
FIND_IN_SET() http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_find-in-set
Da FIND_IN_SET bei Nichtfinden eine 0 herausgibnt und MySQL 0 als False intepretiert, geht das relativ elegant
SQL:
SELECT*
FROM questions
WHERE FIND_IN_SET($c, category )

Die Anzahl der Datensätze ist erst mal kein Argument gegen Normalisierung (eher für). Ich würde dir jedenfalls dringend dazu raten.
Kann ich nur unterschreiben. Die müssen auch nicht von Hand normalisiert werde...

Nachtrag zum Normaliesieren.
Hab mit mal auf die schnelle ein Beispiel gemacht.
list_cat: Alle Kategorien
list_dat: Alle Daten mit dem feld 'list' das die Kategorien-IDs beinhalten
list: Die zu erstelende Zuordnungstabelle
SQL:
CREATE TABLE list_zuordnung
SELECT 
    dat.id AS datId,
    cat.id AS catId
FROM 
    list_cat AS cat,
    list_data AS dat
WHERE FIND_IN_SET(cat.id, dat.list)
ORDER BY dat.id, cat.id

Du siehst also, normalisieren ist nicht schwer.....
 
Zuletzt bearbeitet von einem Moderator:
danke für eure Hinweise. Jetzt klappts. Ich hatte das mit dem LIKE und OR auch probiert, aber eine falsche SELECT-Anweisung geschrieben gehabt. Möööp. :)

Ich werds normalisieren, versprochen. Hab ich mir schon auf die ToDo-Liste geschrieben.

danke nochmal!
 
Zurück