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 14:52:49 CEST 2005


Nochmals vielen Dank für eure Antworten und Mühe.

Langsam sehe ich ein Licht am Ende des SQL-Gottharts ;)

@Christop:

Ich glaube diese Query hatte ich auch schon ausprobiert

    SELECT $requiredFields
      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>
     WHERE b.vorname = <gesuchter_begriff_0>
        OR b.nachname = <gesuchter_begriff_0>

habe allerdings nicht die gewünschten ergebnisse erhalten.


Die AND-Verknüpfte abfrage sieht nun so aus (es ist noch eine Verknüpfung
hinzugekommen, da der Benutzer einer Verwaltung angehört und nur die
Benutzer der gewählten verwaltung gefunden werden sollen):

SELECT
	$requiredFields
FROM
	 tbl_benutzer
INNER JOIN tbl_suchbegriffe AS s1
ON ( (tbl_benutzer.id = s1.bid AND s1.suchbegriff = '".$validWords[0]."' AND
s1.vid = '$verwaltungId') OR tbl_benutzer.name = '".$validWords[0]."')
INNER JOIN tbl_suchbegriffe AS s2
ON ( (tbl_benutzer.id = s2.bid AND s2.suchbegriff = '".$validWords[1]."' AND
s2.vid = '$verwaltungId') OR tbl_benutzer.name = '".$validWords[1]."')
GROUP BY tbl_benutzer.id

Ich habse diese mit allen möglichen Suchbegriffs-Variationen bombardiert,
und es scheint als ob sie die richtigen Ergebnisse liefert.
Ich werde diese Query dann dynamisch nach der Anzahl der Suchbegriffe
generieren. Wenn Ihr sagt das ist einigermaßen performant so, bin ich sehr
zufrieden ;)


Nun noch zu meiner "OR"-Verknüpfung.
Diese wird auch nach Anzahl der Suchwörter erstellt, ein bsp. sieht so aus:

SELECT
	$requiredFields
FROM
	tbl_benutzer, tbl_suchbegriffe
WHERE (
	tbl_benutzer.name LIKE '%hello%' OR
	tbl_benutzer.strasse LIKE '%hello%' OR
  	tbl_suchbegriffe.suchbegriff LIKE '%hello%' AND
	tbl_suchbegriffe.vid = '87' AND suchbegriffe.bid = tbl_benutzer.id )
OR (
	tbl_benutzer.name LIKE '%world%' OR
	tbl_benutzer.strasse LIKE '%world%' OR
	suchbegriffe.suchbegriff LIKE '%world%' AND
	suchbegriffe.vid = '87' AND
	suchbegriffe.bid = tbl_benutzer.id )
GROUP BY tbl_benutzer.id




Von der Abfrage-Dauer haben beide ziemlich genau gleich lang gebraucht,
allerdings habe ich keine Ahnung ob diese werte realistisch sind wenn sich
die Datenbank einmal füllt (Das die Abfrage länger dauern wird ist klar, ich
mein ob beide Abfragen bei großen Datenvolum gleich schnell bleiben.)


Auf jeden Fall noch einmal vielen vielen Dank an euch DB-Profis, alleine
hätte ich wahrscheinlich Monate gebraucht...Aber ich hab wieder was
dazugelernt ;)


Noch eine abschließende Frage: Wirken sich die LIKE-Vergleiche sehr stark
auf die Performance aus ?


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

-----Ursprüngliche Nachricht-----
Von: Christoph 'Leo' Weißenborn [mailto:chw-le at gmx.de]
Gesendet: Donnerstag, 20. Oktober 2005 13:52
An: mysql-de at lists.4t2.com
Betreff: Re: Wie gestaltet man diese Abfrage ?


Zitat von Benjamin Wolf <bwolf at mailserv.wiesloch.shs-it.de>:
>    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
> [...]
> allerdings sollte auch der Name des Benutzers mit einbezogen werden.

Das ist ja nur noch eine primitive WHERE-Klausel mehr.
Ich kopiere mal von Andreas:
    SELECT $requiredFields
      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>
     WHERE b.vorname = <gesuchter_begriff_0>
        OR b.nachname = <gesuchter_begriff_0>

(... für 4 suchbegriffe, 0-4)

Noch ein Hinweis: Der WHERE-Teil mit "IS NOT NULL" ist überflüssig, denn
solange
die Variablen nicht NULL sind, was man fürhin unterstellen kann, ist dies
bei
einem INNER JOIN immer erfüllt. Den LEFT JOIN sollte man der Einfachheit
halber
hier nicht benutzen.

Gruß,
 Christoph
--
Fingerprint=65B7 73B6 5969 AC2B 4572 39A2 0DBC DAC1 3D6A 45B7

----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.

--
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