MySQL 5 - findet manchmal kein Ergebnis
Kalle_B
- datenbank
Hallöle,
habe da ein merkwürdiges Phänomen. Vielleicht besteht es auch nur im Balken vor meinem Kopf.
Wenn ich aufgrund geografischer Koordinaten Nachbarorte suche, gibt es bei 5 km Umkreis einige Treffer, bei 10 km Umkreis keinen einzigen. Da müssten doch mindestens die 5 km - Orte enthalten sein.
SQL für 5 km (6 Treffer):
-------------------------
SELECT
SQL_CALC_FOUND_ROWS
ort1.*
,count(trm1.id) anzahl_events
FROM bia_orte ort1
LEFT JOIN bia_termine trm1
ON trm1.ort_id = ort1.id
WHERE ort1.geo_breite <= '49.8415392961' AND ort1.geo_breite >= '49.7515492961' AND ort1.geo_laenge <= '9.97774431165' AND ort1.geo_laenge >= '9.88775431165'
GROUP BY ort1.id
ORDER BY ort1.name, ort1.plz
SDQL für 10 km (kein Treffer):
------------------------------
SELECT
SQL_CALC_FOUND_ROWS
ort1.*
,count(trm1.id) anzahl_events
FROM bia_orte ort1
LEFT JOIN bia_termine trm1
ON trm1.ort_id = ort1.id
WHERE ort1.geo_breite <= '49.8865342961' AND ort1.geo_breite >= '49.7065542961' AND ort1.geo_laenge <= '10.0227393116' AND ort1.geo_laenge >= '9.84275931165'
GROUP BY ort1.id
ORDER BY ort1.name, ort1.plz
Wo ist der Denkfehler?
Lieben Gruß, Kalle
Hi,
WHERE ort1.geo_breite <= '49.8415392961' AND ort1.geo_breite >= '49.7515492961' AND ort1.geo_laenge <= '9.97774431165' AND ort1.geo_laenge >= '9.88775431165'
WHERE ort1.geo_breite <= '49.8865342961' AND ort1.geo_breite >= '49.7065542961' AND ort1.geo_laenge <= '10.0227393116' AND ort1.geo_laenge >= '9.84275931165'
Wo ist der Denkfehler?
Vermutlich in der irrigen Annahme, '10.0227393116' wäre kleiner als '9.97774431165'.
MfG ChrisB
Die beiden Zahlen sind die obere Schranke. Die ist beim größeren Suchradius höher, ich finde das schon korrekt so.
Vielleicht hängts mit den Anführungezeichen zusammen? Die Werte sind wahrscheinlich ja eine Zahl.
Sonst nimm dir doch mal eine Stadt und gib die mit im WHERE an. Dann bau der Reihe nach die einzelnen Koordinaten dazu und schau wann die Stadt nicht mehr kommt.
Hi,
»» WHERE ort1.geo_breite <= '49.8415392961' AND ort1.geo_breite >= '49.7515492961' AND ort1.geo_laenge <= '9.97774431165' AND ort1.geo_laenge >= '9.88775431165'
»»
»» WHERE ort1.geo_breite <= '49.8865342961' AND ort1.geo_breite >= '49.7065542961' AND ort1.geo_laenge <= '10.0227393116' AND ort1.geo_laenge >= '9.84275931165'
»»
»» Wo ist der Denkfehler?Vermutlich in der irrigen Annahme, '10.0227393116' wäre kleiner als '9.97774431165'.
Hmm - das ist es wohl. Wenn ich die beiden Strings vergleiche, ist der erste tatsächlich kleiner als der zweite. Er sollte aber größer sein.
10.0227393116
9.84275931165
Mein Fehler ist, dass ich Strings statt Zahlen vergleiche.
Kalle
Hello Kalle,
WHERE ort1.geo_breite <= '49.8415392961' AND ort1.geo_breite >= '49.7515492961' AND ort1.geo_laenge <= '9.97774431165' AND ort1.geo_laenge >= '9.88775431165'
Zeig doch mal die Spaltentypen für die Tabelle :-)
Du weißt doch, man kann soviel Bretter vor dem Kopf haben, wie man will, Hauptsache, man behält den Durchblick:
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hello Tom,
»» WHERE ort1.geo_breite <= '49.8415392961' AND ort1.geo_breite >= '49.7515492961' AND ort1.geo_laenge <= '9.97774431165' AND ort1.geo_laenge >= '9.88775431165'
Zeig doch mal die Spaltentypen für die Tabelle :-)
geo\_laenge
varchar(20) collate utf8_unicode_ci NOT NULL,
geo\_breite
varchar(20) collate utf8_unicode_ci NOT NULL,
Du weißt doch, man kann soviel Bretter vor dem Kopf haben, wie man will, Hauptsache, man behält den Durchblick:
danke für deinen Trost ;-)
MfG Kalle
Hello Kalle,
»» WHERE ort1.geo_breite <= '49.8415392961' AND ort1.geo_breite >= '49.7515492961' AND ort1.geo_laenge <= '9.97774431165' AND ort1.geo_laenge >= '9.88775431165'
Zeig doch mal die Spaltentypen für die Tabelle :-)
geo\_laenge
varchar(20) collate utf8_unicode_ci NOT NULL,
geo\_breite
varchar(20) collate utf8_unicode_ci NOT NULL,
Falscher Spaltentyp. Du hättest dafür Decimal nehmen sollen, dann klappts auch mit der Sortierung.
Aber ich glaube, dass Du den Typ verlustfrei umstellen kannst. Aber bitte vorher an einer Testtabelle ausprobieren!
Liebe Grüße aus dem Cyberspace
Tom vom Berg
Hallo, Tom,
»»
geo\_laenge
varchar(20) collate utf8_unicode_ci NOT NULL,
»»geo\_breite
varchar(20) collate utf8_unicode_ci NOT NULL,Falscher Spaltentyp. Du hättest dafür Decimal nehmen sollen, dann klappts auch mit der Sortierung.
Aber ich glaube, dass Du den Typ verlustfrei umstellen kannst. Aber bitte vorher an einer Testtabelle ausprobieren!
Danke, behalte ich mal im Hinterkopf.
Es geht aber auch so, also ohne Hochkommas:
WHERE geo_laenge < 10.2 AND geo_laenge > 9.8
da wird der Feldinhalt offenbar konvertiert, nachdem solche Versuche
WHERE FLOAT(geo_laenge) < 10.2 AND FLOAT(geo_laenge) > 9.8
Fehler ergaben. Aber irgendeine erzwungene Konvertierung müsste doch möglich sein?
Gruß, Kalle