Seite 1 von 1

Problem mit einer Abfrage

Verfasst: 05.07.2009, 18:06
von Michael1967
Hallo,

habe mal wieder ein Problem. Also ich habe eine Datenbanktabelle - darin gespeichert werden die Suchbegriffe. Also die Suchbegriffe womit meine Besucher über Google auf meine Seite gekommen sind.

Nun habe ich eine Suche in meine Seite eingebaut. Sollte nun jemand nach dem Suchbegriff "witze" suchen, so möchte ich am Ende der Seite die letzten Suchanfragen zu dem Begriff "witze" einblenden.

Folgende Abfrage erzeugt schon eine Ausgabe - nur leider nicht so wie ich möchte.

Code: Alles auswählen

$abfrage = "SELECT DISTINCT words FROM words_search where words LIKE '%$the_query%' GROUP BY words order by id DESC limit 10"; 
$ergebnis = mysql_query($abfrage);
   
while($row = mysql_fetch_object($ergebnis)) {

echo "'.$row->words.'";

} 
In %$the_query% befindet sich der gesuchte Begriff.

Ausgabe schaut ungefähr so aus -

lustige witze
schwitzen
usw.

Nun der Begriff "schwitzen" beinhaltet wohl auch "witze", soll aber nicht mit eingeblendet werden.

Was muss ich machen, damit er keine Suchbegriffe innerhalb eines Begriffes mit einbezieht?

Also die Suche nach "witze" hat ja nichts mit schwitzen zu tun, lol.

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Verfasst: 05.07.2009, 20:49
von LinkPop
Mit Leerzeichen arbeiten:

Code: Alles auswählen

words LIKE '% $the_query %' OR words LIKE '$the_query %' OR words LIKE '% $the_query'

Verfasst: 05.07.2009, 22:36
von Michael1967
Da wäre ich jetzt nicht drauf gekommen. Klappt wunderbar. Vielen Dank für den Tipp! :D

Verfasst: 06.07.2009, 10:10
von nerd
total schlecht fuer die performance wenn du bei sowas mit "like '%'" rangehst, da bei sowas auch ein eventuell gesetzter index nutzlos ist. deutlich sinnvoller waere es hier die abfrage schon vor dem insert auseinanderzumehmen, und pro zeile nur ein wort zu speichern. das macht auch alle abfragen leichter....

Verfasst: 06.07.2009, 15:24
von Michael1967
Und wie macht man das?

Verfasst: 06.07.2009, 16:15
von Outman
@Michael1967 Nerd meint, dass du bei deinen Eintrag bevor dieser gespeichert wird, das Keywort in einer Keywort Tabelle gespeichert wird und über einer Verknüpfungstabelle an hand einer ID Nummer die Verknüpfung gemacht wird.

Wenn du nun auf einen Artikel die entsprechenden Keywörter haben möchtest, musst du nur noch eine Abfrage auf das Keywort in der Keywort Tabelle machen und an hand der ID Nummer die entsprechende Verknüpfung zu den Artikel finden. Dadurch das dies direkt über ein Zahlenfeld mit einem Index gemacht wird gewinnst du bedeuten mehr Performa. Wenn du erst die Tabelle sortieren musst mit GROUP BY, damit entsprechend nur ein einzelnes Keywort gefunden wird mit DISTINCT, kann es bei großen Tabellen recht langsam werden. Ich würde mir Gedanken machen wenn du viele Keywörter in naher Zukunft in dieser Tabellen speichern wirst.

Verfasst: 06.07.2009, 18:06
von Michael1967
Die Suchbegriffe befinden sich schon in einer Tabelle. Das sind Suchbegriffe womit meine Seite über Google gefunden wurde. Das hat mit Artikeln und IDs nichts zu tun!

nerd meinte (denke ich) was ganz anderes.

Verfasst: 06.07.2009, 19:26
von Outman
Michael1967 hat geschrieben:Die Suchbegriffe befinden sich schon in einer Tabelle. Das sind Suchbegriffe womit meine Seite über Google gefunden wurde. Das hat mit Artikeln und IDs nichts zu tun!

nerd meinte (denke ich) was ganz anderes.
Nicht wirklich :lol: ich habe seine Aussage ein wenig falsch im ersten Moment interpretiert und schon ein wenig weiter gedacht.

Also hier mal ein Code womit Du vor den Speichern auf der Tabelle Checken kannst, ob schon ein Eintrag vorhanden ist:

Code: Alles auswählen

<?php
/*
 * Created on 06.07.2009 by Nico Schubert
 */
 
$mein_suchwort='keywort';
if&#40;$mein_suchwort!=''&#41;&#123;
	$sql_select="SELECT count&#40;id&#41; AS `anz` FROM `words_search` WHERE `words` = '".mysql_escape_string&#40;$mein_suchwort&#41;."' LIMIT 1;";
	$query=mysql_query&#40;$sql_select&#41; or die&#40;'Fehler beim Lesen!'&#41;;
	$daten=mysql_fetch_assoc&#40;$query&#41;;
	if&#40;!isset&#40;$daten&#91;'anz'&#93;&#41;&#41; $anz=0; else $anz=$daten&#91;'anz'&#93;;
	if&#40;$anz==0&#41;&#123;
	   // Neuer Eintrag
	   $sql_insert="INSERT INTO `words_search` &#40;`words`&#41; VALUES&#40;'".mysql_escape_string&#40;$mein_suchwort&#41;."'&#41;;";
	   mysql_query&#40;$sql_insert&#41; or die&#40;'Fehler beim Speichern!'&#41;;
	&#125; else &#123;
	   // Update	
	&#125;
&#125;
?>
Ich hoffe das ich ein wenig für klarheit gesorgt habe und es für Dich nun verständlicher ist. :) Ich habe da schon viel weiter gedacht ....

Verfasst: 06.07.2009, 19:34
von Outman
Auch hier noch die Antwort zum Thema Suche, ich würde das mit MATCH und AGAINST machen https://dev.mysql.com/doc/refman/5.1/de ... earch.html

Verfasst: 06.07.2009, 22:54
von Michael1967
Hmmm, irgendwie hat man mich wohl falsch verstanden. Also in meiner Tabelle sind die Suchbegriffe schon gespeichert - das passiert immer dann, wenn jemand über die Google-Suche usw. auf meine Seite kommt.

Ich möchte nun einfach nur die letzten 10 Suchanfragen zu einem Suchbegriff einblenden. Ich frage mich gerade, warum ich checken soll ob ein Eintrag in der Tabelle schon vorhanden ist?

*grübel*

Da sind schon 10.000 oder mehr Suchanfragen in der Datenbank gespeichert. Sucht nun jemand (nur als Beispiel) auf meiner Seite nach Witze - so möchte ich dazu die letzten 10 Suchanfragen aus der Tabelle holen.

Verfasst: 07.07.2009, 06:57
von Outman
Huhu,


hier ein Beispiel Abfrage mit MATCH und AGAINST. Damit diese Abfrage geht muss das Feld "words" eine Fulltext Index haben. Ich glaube es hat kein Sinn Dir zu erklären, wieso man in der Datenbank versucht nicht doppelte Datensätze zu haben. Ich habe mit mein Beiträgen oben versucht Dir zu erklären wie man das mit dreit Tabellen umgehen kann.

Code: Alles auswählen

<?php
/*
 * Created on 07.07.2009 by Nico Schubert
 */
$keywort='witz';
$sql_select="SELECT id, words, MATCH &#40;words&#41; AGAINST &#40;'".mysql_escape_string&#40;$keywort&#41;."'&#41; AS score FROM words_search WHERE MATCH &#40;words&#41; AGAINST &#40;'".mysql_escape_string&#40;$keywort&#41;."'&#41; LIMIT 10";
$query = mysql_query&#40;$sql_select&#41;;
if&#40;mysql_num_rows&#40;$query&#41;!=0&#41;&#123;
	echo 'Keywort -> Relevante zu <br>';
    while&#40;$daten = mysql_fetch_assoc&#40;$query&#41;&#41;&#123;
    	echo $daten&#91;"words"&#93;.' -> '.$daten&#91;"score"&#93;.'<br>';
    &#125;
&#125;
?>

Verfasst: 07.07.2009, 08:48
von Michael1967
Ja erstmal danke! Ich habe doch gar kein Problem mit doppelten Einträgen in der Datenbank. Hatte ich hier auch nicht erfragt - deswegen wunderte ich mich ja auch - warum ich das voher checken soll. :D

Mit deinem letzten Posting hast du mir aber geholfen. Vielen Dank!