Wie funktioniert die phpbb Suche?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
RusTin
Mitglied
Beiträge: 269
Registriert: 20.09.2003 08:45
Wohnort: Düppenweiler
Kontaktdaten:

Beitrag von RusTin »

das is mir schon klar. die obere abfrage von mir war ja auch nur die erste warte ich geb dir mal den kompletten code:

Code: Alles auswählen

$result_words = mysql_query("SELECT word_id FROM phpbb_search_wordlist WHERE word_text LIKE '%$begriff%'");
$ergebnisse = array();

while($row = mysql_fetch_array($result_words)){
 $result_match = mysql_query("SELECT post_id FROM phpbb_search_wordmatch WHERE word_id = {$row['word_id']}");

 $row_2 = mysql_fetch_array($result_match);
 $result_topics = mysql_query("SELECT topic_id, topic_title, topic_time FROM phpbb_topics WHERE forum_id = 20 AND topic_first_post_id = {$row_2['post_id']}");

 if($row_3 = mysql_fetch_array($result_topics) AND $row_3['topic_id'] != $topic_id){
  array_push($ergebnisse, array($row_3['topic_id'], $row_3['topic_title'], $row_3['topic_time']));
 }

 $topic_id = $row_3['topic_id'];
}
das sollte doch funktionieren, oder?
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Code: Alles auswählen

while($row = mysql_fetch_array($result_words)){ 
 $result_match = mysql_query("SELECT post_id FROM phpbb_search_wordmatch WHERE word_id = {$row['word_id']}"); 
So wirst du nir das letzte passende Wort finden können, wenn du jedes mal $result_match überschreibst.
Versuch mal die Tabellen mit JOINs zu verknüpfen - dann sollte das deutlich einfacher sein.

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Benutzeravatar
MrMind
Mitglied
Beiträge: 464
Registriert: 29.11.2003 17:14
Wohnort: Darmstadt/Odw
Kontaktdaten:

Beitrag von MrMind »

Oder wie folgt vorgehen:

Code: Alles auswählen

while($row = mysql_fetch_array($result_words))
{
    $result_match .= ( !empty($result_match) ) ? ',' : ''; 
    $result_match .= mysql_query("SELECT post_id FROM phpbb_search_wordmatch WHERE word_id = {$row['word_id']}");
}
Somit sollten alle Einträge durch Kommata getrennt werden und am Ende mit

Code: Alles auswählen

$result_match = explode(','$result_match);
in ein Array umgesetzt werden.

Diese Lösung ist nur dann ideal, wenn man sich noch net mit JOIN in SQL-Anweisungen auskennt ;)

Oder den Code net wegen JOIN-Anweisungen komplett ändern möchte ;)

Mfg
MrMind
Selbst ist der Coder
Coder unter Linux
Benutzeravatar
RusTin
Mitglied
Beiträge: 269
Registriert: 20.09.2003 08:45
Wohnort: Düppenweiler
Kontaktdaten:

Beitrag von RusTin »

aaa stimmt! Da war ein kleiner Denkfehler. Code ist also so:

Code: Alles auswählen

$result_words = mysql_query("SELECT WMATCH.post_id FROM phpbb_search_wordlist WLIST LEFT JOIN phpbb_search_wordmatch WMATCH ON WLIST.word_id=WMATCH.word_id WHERE WLIST.word_text LIKE '%$begriff%' ORDER BY WMATCH.post_id DESC");

while($row = mysql_fetch_array($result_words)){
 $result_topics = mysql_query("SELECT topic_id, topic_title, topic_time FROM phpbb_topics WHERE forum_id = 20 AND topic_first_post_id = {$row['post_id']}");

 if($row_2 = mysql_fetch_array($result_topics)){
  if($row_2['topic_id'] != $topic_id){
   array_push($ergebnisse, array($row_2['topic_id'], $row_2['topic_title'], $row_2['topic_time']));

   $topic_id = $row_2['topic_id'];
  }
 }
}
bei sehr häufig gebrauchten wörtern braucht die Abfrage sehr lang. Kann man da noch was dran "tunen", bzw. hab ich da was sehr leistungsfressendes verbaut?
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

RusTin hat geschrieben:Kann man da noch was dran "tunen", bzw. hab ich da was sehr leistungsfressendes verbaut?
Du bist dabei deinen SQL Server zu Tode abzufragen :lol:
Für Jede Zeile die er in der ersten Abfrage findet wird er die folgende Table durchgehen und dies immer und immer wieder bis er fertig ist.....

Sinn und Zweck von Left Join, Right Join, Inner Join, Outer Join usw. ist es Tabellen zu verknüpfen damit diese nur einmal durchgegangen werden müssen......

Wenn ich das richtig sehe solltest du damit alles bekommen was du haben willst:

Code: Alles auswählen

SELECT 
  WMATCH.post_id,
  T.topic_title,
  T.topic_time,
  T.topic_id 
  FROM 
   phpbb_search_wordlist WLIST
 LEFT JOIN
  phpbb_search_wordmatch WMATCH
 ON WLIST.word_id=WMATCH.word_id
 LEFT JOIN
  phpbb_topics T
 ON WMATCH.post_id=T.topic_first_post_id
WHERE 
  WLIST.word_text LIKE '%blubb%' AND T.forum_id='20'
ORDER BY WMATCH.post_id DESC;
Überprüfe mal ob du Nullwerte bekommst und wenn ja in welcher Folge....
Ich denke das zweite LEFT JOIN solltest dann durch ein INNER JOIN ersetzen....
Benutzeravatar
RusTin
Mitglied
Beiträge: 269
Registriert: 20.09.2003 08:45
Wohnort: Düppenweiler
Kontaktdaten:

Beitrag von RusTin »

hmm! das dauert jetzt sogar noch länger! aber ich werd das da mal lassen, sieht besser aus :)
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

RusTin hat geschrieben:hmm! das dauert jetzt sogar noch länger! aber ich werd das da mal lassen, sieht besser aus :)
Ersetze mal zweites left join durch inner join oder mal beide left joins durch ein inner join ist das schneller?
Benutzeravatar
RusTin
Mitglied
Beiträge: 269
Registriert: 20.09.2003 08:45
Wohnort: Düppenweiler
Kontaktdaten:

Beitrag von RusTin »

Beide mit INNER JOIN, dann geht die Suche ab wie Schmierseife! DANKE!

Wo bekomme ich denn gute Infos zu den Join Befehlen her?
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

RusTin hat geschrieben:Beide mit INNER JOIN, dann geht die Suche ab wie Schmierseife! DANKE!

Wo bekomme ich denn gute Infos zu den Join Befehlen her?
hmm Mysql-Manual
http://dev.mysql.com/doc/mysql/de/index.html

Hätte es gleich wissen müssen *grml*
Left Join wertet Datensätze aus die es in der anderen Table nicht gibt und gibt dort Null Werte zurück da die Relation nicht aufgelöst werden kann. inner join check in Table A und Table B ab ob es übereinstimmungen gibt wenn nicht verwirft er es......

Dennoch ist Left JOin bzw. Right Join wunderbar wenn ich wissen will ob ein erwarteter Wert in der verknüpften Table vorkommt oder nicht...
Durch den Nullwert könnte ich feststellen kein Eintrag = kein Recht.....Eintrag vorhanden er hat das recht.......

Diese Funktionalität hab ich für mein Berechtigungssystem genutzt, daher brauche ich zum Geben bzw. Nehmen eines Rechtes nur ein Insert oder Delete
Benutzeravatar
RusTin
Mitglied
Beiträge: 269
Registriert: 20.09.2003 08:45
Wohnort: Düppenweiler
Kontaktdaten:

Beitrag von RusTin »

hab jetzt noch eine Frage, undzwar kommen ja jetzt recht häufig mehrere Einträge raus, da ja häufig das suchwort öfters im beitrag vorkommt. Hab dann ne Abfrage später gemacht, allerdings kann ich dann nicht mehr korrekt mit LIMIT arbeiten. wie kann man das denn besetigen, dass er mehrmals die gleiche topic_id liefert?
Antworten

Zurück zu „Coding & Technik“