Seite 2 von 3
Verfasst: 07.11.2004 13:59
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?
Verfasst: 07.11.2004 14:29
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
Verfasst: 07.11.2004 14:33
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
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
Verfasst: 07.11.2004 15:13
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?
Verfasst: 07.11.2004 15:46
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

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....
Verfasst: 07.11.2004 17:02
von RusTin
hmm! das dauert jetzt sogar noch länger! aber ich werd das da mal lassen, sieht besser aus

Verfasst: 07.11.2004 18:04
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?
Verfasst: 07.11.2004 18:37
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?
Verfasst: 07.11.2004 18:47
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
Verfasst: 08.11.2004 15:49
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?