phpbar.de logo

Mailinglisten-Archive

AW: sql query

AW: sql query

Ralf Narozny mysql-de_(at)_lists.bttr.org
Wed, 24 Jul 2002 16:28:56 +0200


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