phpbar.de logo

Mailinglisten-Archive

[dbs] Problem mit Abfrage

[dbs] Problem mit Abfrage

Hovorka, Tobias T.Hovorka at mlconsulting.de
Fre Dez 3 10:22:14 CET 2004


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