Mailinglisten-Archive |
Hallo Liste, folgendes Problem: Ich habe drei Tabellen: benutzer, kenntnisse und benutzer_kenntnisse Benutzer können ihre Kenntnisse pflegen (1,*), diese werden dann in benutzer_kenntnisse gespeichert. Ich muss nun eine Suchfunktion implementieren (php): Ein Besucher der Website kann über Checkboxen Kenntnisse auswählen und bekommt dann eine Liste der Benutzer die dem gesuchten am nahesten kommen. Ich suche also die Schnittmenge zwischen gesuchten Kenntnissen und den Kenntnissen der Benutzer. Je größer die Schnittmenge ist, desto höher die Position im Sucherergebnis. Zurzeit löse ich das so: 1. Anzahl der Benutzer ermitteln die min. eine gesuchte Kenntnis haben. Dies mache ich um das Sucherergebnis auf mehrere Seiten aufteilen zu können. 2. Die Anzahl der gesuchten Kenntnisse aus "benutzer_kenntnisse" ermitteln, gruppiert nach den Benutzern und Limitiert auf 10 Das Ergebnis sieht dann so aus: benutzer_id | anzahl 32 | 3 // benutzer 32 hat 3 der gesuchten Kenntnisse ...usw. 45 | 9 65 | 1 Dieses Ergebnis speichere ich in einem Array. 3. Nun Frage ich die Benutzer samt Kenntnissen, anhand der benutzer_id's in dem Array ab und gebe das ganze aus. Der Nachteil daran: Das Ergebnis aus 3. ist nicht mehr nach der Anzahl der Treffer sortiert. Auch die Tatsache das ich 3 Querys brauche stört mich. Kann ich 2. und 3. zu einem Query zusammenfassen? Habe das über nen self-join probiert, leider ohne Erfolg. Ich bekomme immer nur die Anzahl der vorhandenen Kenntnisse und eine einzige kenntniss_id. Hier mal der Query: SELECT COUNT(a.fk_benutzer_id) as anzahl, t.fk_benutzer_id, t.fk_kenntniss_id as kenntniss_id FROM benutzer_kenntnisse as t LEFT JOIN benutzer_kenntnisse as a ON a.benutzer_id=t.benutzer_id WHERE a.fk_kenntniss_id=32 OR [...] GROUP BY t.benutzer_id ORDER BY anzahl DESC LIMIT $start, $limit Kann mir jemand bitte einen anderen Lösungsansatz nennen? Hier noch mal die Tabellen im Detail: [benutzer] benutzer_id, benutzername [kenntnisse] kenntniss_id, kenntniss [benutzer_kenntnisse] fk_benutzer_id, fk_kenntniss_id Vielen Dank! Tobias
php::bar PHP Wiki - Listenarchive