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