Code: Alles auswählen
SELECT uov.user_id, gl.country, gl,plz, [hier die entfernungsbrechnung] AS entfernung
FROM geodb_locations gl
JOIN user_option_value uov ON (uov.userOption65 = gl.plz AND uov.userOption85 = gl.country)
WHERE [entfernungsfilter]
Code: Alles auswählen
SELECT uov.user_id, gl.country, gl,plz, [hier die entfernungsbrechnung] AS entfernung
FROM geodb_locations gl
JOIN user_option_value uov ON (uov.userOption65 = gl.plz AND uov.userOption85 = gl.country)
WHERE [entfernungsfilter]
Das sollte aber trotzdem gehen und bei sehr vielen Vergleichen auch schneller sein. Ob da nun DE oder Deutschland steht ist doch egal. Mit concat machst du einen Stringvergleich bei der Postleitzahl während eigentlich ein einfacher Zahlenvergleich reicht. Das lässt dann falls irgendwie möglich nämlich auch noch anderweitige Optimierungen zu und sollte vom Ergebnis aber das gleiche liefern wie concat und auch in den selben Situationen nutzbar sein.Wuppi hat geschrieben:
@gn#36: auf den Teil der DB hab ich keinen Einfluss - ich lese nur das aus was über die Profileinstellungen da rein wandert. Von daher hab ich da "Österreich, Deutschland, Schweiz" stehen. Das Ö hatte mir schon Probleme bereitet ... DE, AT, CH wäre mir lieber ... würde mir auch das umformen für die GeoDB sparen (da steht nur DE, AT, CH drin)
Indize sind in der Tabelle nur auf die userID - und wie gesagt: die Tabelle wird von einem System verwaltet. K.a. was da passiert wenn ich da indize setze und dann kommt nen update was mir das alles wieder zurücksetzt. Je weiter ich bei dem Seite vorankomme, desto mehr komme ich der Überzeugung das es einfacher gewesen hätte ich hätte hierfür eine eigene Tabelle genommenaktuell brauch ich hier 4 Tabellen, mit einer eigenen Tabelle bräuchte ich nur noch 2. Nur da hätte ich die Datenerfassung halt komplett selber machen müssen (statt was fertiges zu nehmen) - das wollte ich mir ersparen - das war der Fehler:( ... Version 2 wird kommen
![]()
Danke
Gruß
Code: Alles auswählen
SELECT name, plz, country, ( 6371 * SQRT(2*(1-cos(RADIANS(lat)) * cos(0.88895378390603) * (sin(RADIANS(lon)) * sin(0.12130038301361) + cos(RADIANS(lon)) * cos(0.12130038301361)) - sin(RADIANS(lat)) * sin(0.88895378390603)))) AS Distance FROM geodb_locations WHERE 6371 * SQRT(2*(1-cos(RADIANS(lat)) * cos(0.88895378390603) * (sin(RADIANS(lon)) * sin(0.12130038301361) + cos(RADIANS(lon)) * cos(0.12130038301361)) - sin(RADIANS(lat)) * sin(0.88895378390603))) <= 25 ORDER BY Distance
Code: Alles auswählen
SELECT uov.userid, gl.country, gl.plz,
( 6371 * SQRT(2*(1-cos(RADIANS(gl.lat)) * cos(0.88895378390603) * (sin(RADIANS(gl.lon)) * sin(0.12130038301361) + cos(RADIANS(gl.lon)) * cos(0.12130038301361)) - sin(RADIANS(gl.lat)) * sin(0.88895378390603))))
AS entfernung
FROM geodb_locations gl
JOIN user_option_value uov ON (uov.userOption65 = gl.plz )
hab mir mal die userOption65 - PLZ mit anzeigen lassen... Ergebnis sieht ja aus wie gewürfeltUserID - PLZ (userOption65) LAND - PLZ (GeoDB) - entfernung
1580 2000 AT 2000 717.703720377867
1580 2000 AT 2000 723.245430019754
0 2034 AT 2034 712.321244907324
Naja ohne das Land mit reinzunehmen, kann es natürlich nicht funktionieren, weil dann ja einfach deutsche Postleitzahlen aus der einen Tabelle auf österreichische in der anderen gemappt werden...Wuppi hat geschrieben:Zudem kann ich kein "AND uov.userOption85 = gl.country" setzen, da country nur 2stellig ist, userOption85 aber ausgeschrieben. Wobei ich das in der geo-DB ja komplett ändern kann!
Code: Alles auswählen
1580 2000 Österreich Österreich 2000 716.061769724001
1580 2000 Österreich Österreich 2000 717.703720377867
1580 2000 Österreich Österreich 2000 723.245430019754
0 2034 Österreich Österreich 2034 712.321244907324
Ohne die Inhalte der Datenbank zu kennen, kann man nur raten. Da es üblicherweise mehrere kleinere Orte oder Ortsteile mit der selben Postleitzahl gibt, würde ich aber mal darauf tippen.Wuppi hat geschrieben:aber wieso 3 Unterschiedliche Entfernungen für exakt den gleichen Ort?
Code: Alles auswählen
SELECT uov.userid, gl.country, gl.plz,
( 6371 * SQRT(2*(1-cos(RADIANS(gl.lat)) * cos(0.88895378390603) * (sin(RADIANS(gl.lon)) * sin(0.12130038301361) + cos(RADIANS(gl.lon)) * cos(0.12130038301361)) - sin(RADIANS(gl.lat)) * sin(0.88895378390603))))
AS entfernung
FROM geodb_locations gl
JOIN user_option_value uov ON (uov.userOption65 = gl.plz AND uov.userOption85 = gl.country ) group by userid