phpbar.de logo

Mailinglisten-Archive

AW: Wie gestaltet man diese Abfrage ?

AW: Wie gestaltet man diese Abfrage ?

Benjamin Wolf bwolf at mailserv.wiesloch.shs-it.de
Don Okt 20 11:38:10 CEST 2005


Hi nochmal ! ;)

Vielen Dank für euere Erklärungen und Bemühungen, ich bin schonmal
erleichtert das ich nicht völlig auf dem Holzweg bin. Als SQL-Anfänger tue
ich mir mit dieser Aufgabe ziemlich schwer, ich bin ich sehr dankbar für
euer Unterstüztung.

Ich die Lösung die ich im moment habe, war die von Andrea eben gepostete

SELECT $requiredFields
FROM tbl_benutzer
LEFT JOIN tbl_suchbegriffe AS s1 ON ( tbl_benutzer.id = s1.bid
AND s1.suchbegriff = '".$validWords[0]."')
LEFT JOIN tbl_suchbegriffe AS s2 ON ( tbl_benutzer.id = s2.bid
AND s2.suchbegriff = '".$validWords[1]."')
WHERE s1.suchbegriff IS NOT NULL
AND s2.suchbegriff IS NOT NULL


Wenn diese Abfrage auch performant ist, dann will ich diese Version gerne
verwenden. Allerdings gibt es noch ein Problem für mich damit:
Momentan werden die Suchwörter nur in der tbl_suchbegriff gesucht -
allerdings sollte auch der Name des Benutzers mit einbezogen werden.

Ich habe versucht die Query umzuschreiben, aber habe es nicht geschafft.
Muß die Abfrage für diese Anforderung wieder völlog umgebaut werden, oder
kann das Feld tbl_benutzer.name einfach integriert werden ?

Ich hoffe Ihr könnt mir hierbei noch einmal behilflich sein. (Und ich hoffe
ihr habt nicht das Gefühl das ich euch meine Arbeit machen lasse, aber ich
bin dieser Aufgabe einfach überfordert, und auser Foren, Newsgroups und
Listen habe ich keine Möglichkeit mir hilfe zu suchen)

1000 Dank,

Mit freundlichen Grüßen,
B.Wolf (SHS - Systemhaus Schroeter)

-----Ursprüngliche Nachricht-----
Von: Andreas Müller [mailto:mysql at universalware.de]
Gesendet: Donnerstag, 20. Oktober 2005 11:01
An: mysql-de at lists.4t2.com
Betreff: RE: Wie gestaltet man diese Abfrage ?


Hallo Christoph,
Hallo alle anderen,

für so ein Suchproblem gibt es mit realtionalen Datenbanken keine
allgemeingültig sinnvolle Lösung.
Der bisherige Lösungsansatz ist ja nicht schlecht das über JOINs von
Tabellen zu lösen und noch dazu sehr performant.
Bei deiner Idee Christoph ist die Query nicht optimierbar und es läuft immer
auf einen full table scan hinaus. Nochdazu CPU intensive String suchen.

Die Lösung mit JOINs für AND Verknüpfungen würde ich vorziehen wenn man die
Anzahl der Suchbegriffe so beschränken kann das nicht mehr als 30 Tabellen
(ich glaube per default kann MySQL 32 Tabellen pro Query) verwendet werden.

Wenn man die Query noch etwas umschreibt sieht sie dann so aus:

SELECT b.*
FROM tbl_benutzer b
INNER JOIN tbl_suchbegriffe s1 ON s1.benutzerid=b.benutzerid AND
s1.suchbegriff = <gesuchter_begriff_1>
INNER JOIN tbl_suchbegriffe s2 ON s2.benutzerid=b.benutzerid AND
s2.suchbegriff = <gesuchter_begriff_2>
INNER JOIN tbl_suchbegriffe s3 ON s3.benutzerid=b.benutzerid AND
s3.suchbegriff = <gesuchter_begriff_3>
...

Diese Query lässt sich ja nun ganz einfach generieren weil pro gesuchtem
Begriff einfach eine Zeile dazukommt.
Der Optimizer fängt nun mit dem JOIN an wo die Index Statistik für den
Begriff die kleine Anzahl Datensätze liefert. Daher ist die Abfrage auch
richtig schnell.

Gruß,
Andreas


--
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql


-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive