Mailinglisten-Archive |
Mahlzeit!
Dr. Franz-Josef Huecker wrote:
>At 09:31 23.07.02 +0200, you wrote:
>
>
>
>>könntest du ein wenig konkreter werden ?
>>tabellen, struktur ... ausgaben ?
>>fakten halt ....
>>
>>
>
>Hallo Heinz
>
>Danke fuer die Nachfrage. Es geht konkret darum, dass die Daten fuer ein
>Diskussionsforum nach Topics und Antworten in zwei MySQL-Tabellen und dort
>eben eben in zwei bzw. einer Spalte gespeichert werden, die nach beliebig
>vielen Stichwoerter mit AND- bzw. OR-Verknuepfung und weiteren
>Restriktionen zu durchsuchen sind.
>
> topics-table: "f_thread", cols: subject, message; replies-table:
>"f_threads", cols: message
>
>
Also das ist offensichtlich nicht wirklich komplett und meine Antwort
ist daher auf eigenen 'Vermutungen' aufgebaut.
(
f_thread enthält weitere Attribute, mindestens: fid, forum, mdate
f_threads enthält mindestens fid
)
>So koennte etwa jemand in das Eingabefeld einer Suchmaske [mysql suchen
>fritz] eingeben, weil er gehoert hat, dass Fritz einen tollen Beitrag zu
>den MySQL-Suchmoeglichkeiten geschrieben hat und dass es sehr viele
>Antworten dazu gibt, und klickt dazu noch UND- bzw. ODER-Verknuepfung an.
>Ausserdem gibt es weitere Optionen, wie etwa zeitliche Ausgabe, Beitraege
>der letzten 24 Stunden, und die Beschraenkung auf ein bestimmtes
>thematisches Forum.
>
>Nun sollen beide Tabellen in einem Zug durchsucht werden und alle Beitraege
>ausgeben, die geschrieben wurden zu 'MySQL && suchen && Fritz' bzw. zu
>'MySQL || suchen || Fritz'. Der Select-Befehl, den ich zur Zeit nutze
>(s.u.), leistet das nicht, sondern wuerde in diesem Fall nur Datensaetze
>ausgeben, in denen sich der String "mysql suchen Fritz" findet und wuerde
>wahrscheinlich dann ueberhaupt keine Treffer ausgeben koennen obwohl es
>ueber hunderte von Beitraegen gibt, die diese Stichwoerter insgesamt oder
>teilweise enthalten.
>
>--
>SELECT DISTINCT f_thread.* FROM f_thread,f_threads WHERE f_thread.fid =
>f_threads.fid && f_threads.message LIKE '%$keywords%' && f_threads.rdate >=
>'$show_time' && f_thread.forum = '$forum' || f_thread.subject LIKE
>'%$keywords%' && f_thread.mdate >= '$show_time' && f_thread.forum =
>'$forum' || f_thread.message LIKE '%$keywords%' && f_thread.mdate >=
>'$show_time' && f_thread.forum = '$forum' ORDER BY fid DESC LIMIT $first,
>$p_split;
>
Erstmal: für einen SQL-Menschen sehen die && und || schrecklich aus ;-)
ansonsten einfach mal
f_threads.message LIKE '%$keywords%'
ersetzen durch
f_threads.message LIKE '%$keyword1%' AND f_threads.message LIKE '%$keyword2%' AND f_threads.message LIKE '%$keyword3%'
bzw. die AND durch OR ersetzen.
SELECT DISTINCT
t.*
FROM
f_thread t,
f_threads r
WHERE
t.fid = r.fid
AND (
(
r.message LIKE '%$keyword1%'
AND r.message LIKE '%$keyword2%'
...
AND r.message LIKE '%$keywordN%'
AND r.rdate >= '$show_time'
AND t.forum = '$forum'
)
OR (
t.subject LIKE '%$keyword1%'
AND t.subject LIKE '%$keyword2%'
...
AND t.subject LIKE '%$keywordN%'
AND t.mdate >= '$show_time'
AND t.forum = '$forum'
)
OR (
t.message LIKE '%$keyword1%'
AND t.message LIKE '%$keyword2%'
...
AND t.message LIKE '%$keywordN%'
AND t.mdate >= '$show_time'
AND t.forum = '$forum'
)
)
ORDER BY
fid DESC
LIMIT
$first, $p_split
;
So in etwa könnte das Statement aussehen...
Gruß
Ralf
--
Ralf Narozny
SPLENDID Internet GmbH & Co KG
Skandinaviendamm 212, 24109 Kiel, Germany
fon: +49 431 660 97 0, fax: +49 431 660 97 20
mailto:rnarozny_(at)_splendid.de, http://www.splendid.de
---
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive