php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Mehrere Keywords abfragen


 
SusiSorglos
16-03-2015, 19:27 
 
Hallo zusammen,

ich habe verschiedene Nachrichten (News) denen ich EIN Keyword zuweise.
Im Frontend lasse ich diese Nachricht nun ausgeben und lasse gleichzeitig nach News suchen die das gleiche Keyword besitzen. Das funktioniert auch ohne Probleme. Jetzt möchte ich das ganze etwas erweitern so das ich mehrere Keywords in ein Feld eintrage und jedes durch Komma separierte Wort soll abgefragt werden.

Also z.B. "telefon, bell, telekom"

Ich würde das ganze jetzt mit Explode anhand der "Kommas" teilen und jeden Fund in einer WHILE durch eine SQL Abfrage schicken.
So würde es auf jeden fall funktionieren, nur das ganze ist doch sicherlich sehr resourcenfressend. Ist mein Vorgehen so richtig oder könnte ich es irgendwie (viel) besser machen?

Cu SusiSorglos

 
fireweasel
17-03-2015, 11:18 
 
Hallo zusammen,

ich habe verschiedene Nachrichten (News) denen ich EIN Keyword zuweise.
Im Frontend lasse ich diese Nachricht nun ausgeben und lasse gleichzeitig nach News suchen die das gleiche Keyword besitzen. Das funktioniert auch ohne Probleme. Jetzt möchte ich das ganze etwas erweitern so das ich mehrere Keywords in ein Feld eintrage und jedes durch Komma separierte Wort soll abgefragt werden.

Also z.B. "telefon, bell, telekom" ...

Für diesen Zweck haben Datenbanken den Datentyp "Set" (Menge). MySQL kennt den auch: MySQL :: MySQL 5.7 Reference Manual :: 11.4.5 The SET Type (http://dev.mysql.com/doc/refman/5.7/en/set.html)

Falls die Datenbank keinen Set-Typ hat oder dieser nicht genug "Keywords" für deine Aufgabenstellung bereitstellt, gibts auch nicht-triviale Lösungen:
* Then each went to his own home - Tags: Database schemas (http://tagging.pui.ch/post/37027745720/tags-database-schemas)
* sql - Database Design for Tagging - Stack Overflow (http://stackoverflow.com/questions/48475/database-design-for-tagging)

 
h3ll
17-03-2015, 21:55 
 
Davon würde ich absehen. Das würde bedeuten, dass man die Tabellenstruktur zur Laufzeit verändern muss. Dadurch kommt man irgendwann in Teufels Küche.

Der SET-Type sollte nur für Werte verwendet werden, die sich zur Laufzeit niemals verändern und nur in Form von neuen Datenbank-Deployments aktualisiert wird.

Besser wäre es eine Tabelle mit Keywords anzulegen.

 
SusiSorglos
17-03-2015, 22:13 
 
Naja, ich habe es eh nicht verstanden. Also habe ich es nochmal mit Explode(,) und dann die SQL-Abfrage in einer foreach zusammen gebastelt. Das funktioniert! Ich dachte nur, das gibt es was von Hause aus, was vielleicht schneller/besser ist.

Dennoch THX

 
h3ll
17-03-2015, 22:17 
 
Naja, ich habe es eh nicht verstanden. Also habe ich es nochmal mit Explode(,) und dann die SQL-Abfrage in einer foreach zusammen gebastelt. Das funktioniert!

Ja, "funktioniert". Aber ist der falsche Weg und wird dir früher oder später große Probleme machen.

Ich dachte nur, das gibt es was von Hause aus, was vielleicht schneller/besser ist.

Ja, gibts. Nennt sich Normalisierung (http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29).

 
fireweasel
17-03-2015, 23:04 
 
Naja, ich habe es eh nicht verstanden.
Was war daran unverständlich? Ich fand die Erklärungen im MySQL-Handbuch durchaus anfängerfreundlich ...


Also habe ich es nochmal mit Explode(,) und dann die SQL-Abfrage in einer foreach zusammen gebastelt. Das funktioniert!
Du fragtest explizit nach Alternativen zu PHP-Basteleien mit String-Funktionen.

Ich dachte nur, das gibt es was von Hause aus, was vielleicht schneller/besser ist.
Ja gibt es:
Ich habe zwei Lösungswege aufgezählt.
Hell hat dir den letzteren der beiden empfohlen.

Davon würde ich absehen. Das würde bedeuten, dass man die Tabellenstruktur zur Laufzeit verändern muss. ...

Der SET-Type sollte nur für Werte verwendet werden, die sich zur Laufzeit niemals verändern und nur in Form von neuen Datenbank-Deployments aktualisiert wird.

Ausgehend von ...
ich habe verschiedene Nachrichten (News) denen ich EIN Keyword zuweise.
... sehe ich die Menge der Keywords als wenig veränderlich an.

Dass die Keywords beim Anlegen der Tabelle festgelegt werden müssen, ergibt sich aus dem ersten Satz des Handbuch-Artikels zum Set-Datentyp (http://dev.mysql.com/doc/refman/5.7/en/set.html) (MySQL):

A SET is a string object that can have zero or more values, each of which must be chosen from a list of permitted values specified when the table is created.

Besser wäre es eine Tabelle mit Keywords anzulegen.
Nicht ohne Grund hatte ich zwei Links mit ein paar Dutzend alternativen Implentierungen fürs Keyword-Tagging ohne Set-Typen angehängt ...


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:44 Uhr.