Kalle_B: MySQL 5 - findet manchmal kein Ergebnis

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

  1. 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

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. 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.

    2. 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

  2. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. 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

      1. 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

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. 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