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