Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 10:58:51 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771212#m1771212 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771212#m1771212 <p>Hallo, ich habe mir ein Skript gekauft und bekomme es nicht zum Laufen. Daher hoffe ich, dass es mit eurer Hilfe gehen könnte.</p> <p>Es geht hiermit los ...</p> <pre><code class="block">/* Pleas use the following SQL script to import the CSV data into MySQL. Please note that you might have to adjust the database name and the path to the CSV file. */ USE db DROP TABLE IF EXISTS plz_de CREATE TABLE plz_de ( land varchar(2), bundesland varchar(48), kreis varchar(48), kreisschluessel varchar(5), plz varchar(5), postfach varchar(1), ort varchar(48), ortsteil varchar(48), latitude decimal(13, 9), longitude decimal(13, 9), gemeindeschluessel varchar(8), iso varchar(5), fips varchar(5), nuts varchar(5), hasc varchar(8), zeitzone varchar(24), utc varchar(6), dst varchar(6) ) LOAD DATA INFILE 'C:\\DE-complete.csv' INTO TABLE plz_de FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' IGNORE 1 LINES; </code></pre> <p>Wenn ich das in PhpMyAdmin machen möchte, kommt (trotz Änderung des Pfads) folgende Fehlermeldung:</p> <pre><code class="block">#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'DROP TABLE IF EXISTS plz_de CREATE TABLE plz_de ( land varchar(2), bun' in Zeile 8 </code></pre> <p>Es geht um eine CSV-Datei. Die kann man natürlich auch über die "Importieren"-Funktion importieren, aber es gibt noch eine weitere CSV-Datei und ich weiß nicht, ob die irgendwie miteinander verknüpft sind, schließlich taucht die (DE-plz) nicht in dem Befehl auf.</p> <p>Ich hab in diesen ganzen Sachen keine Routine mehr (und null Kenntnis über den aktuellen Stand) und bin eigentlich raus aus der Verlosung, daher würde es mich freuen, wenn Ihr mir helfen könntet - herzlichen Dank!</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 11:11:06 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771214#m1771214 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771214#m1771214 <p>Hallo,</p> <blockquote> <pre><code class="block">USE db DROP TABLE IF EXISTS plz_de ... </code></pre> </blockquote> <p>Sollten die einzelnen SQL-Befehle nicht durch ein ";" beendet werden? Die Fehlermeldung weist auch daraufhin, dass das alles als ein Befehl interpretiert wird...</p> <p>Gruß<br> Kalk</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 11:14:11 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771215#m1771215 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771215#m1771215 <p>Tach!</p> <blockquote> <p>ich habe mir ein Skript gekauft und bekomme es nicht zum Laufen. Daher hoffe ich, dass es mit eurer Hilfe gehen könnte.</p> </blockquote> <p>Das Forum ist kein Ersatz für Gewährleistungsansprüche gegen den Hersteller.</p> <blockquote> <pre><code class="block">#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'DROP TABLE IF EXISTS plz_de </code></pre> </blockquote> <p>SQL-Statements werden mit Semikolon abgeschlossen, besonders dann, wenn es als Trennzeichen zwischen mehreren Statements benötigt wird.</p> <p>dedlfix.</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 11:20:34 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771216#m1771216 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771216#m1771216 <p>Hi there,</p> <p>zusätzlich zum schon Gesagten:</p> <blockquote> <p>Es geht um eine CSV-Datei. Die kann man natürlich auch über die "Importieren"-Funktion importieren, aber es gibt noch eine weitere CSV-Datei und ich weiß nicht, ob die irgendwie miteinander verknüpft sind, schließlich taucht die (DE-plz) nicht in dem Befehl auf.</p> </blockquote> <p>CSV-Dateien können nicht verknüpft sein. Wenn eine logische Beziehung existieren sollte (etwa über die PLZ selbst oder irgendeinen Schlüssel), dann kannst Du die ohnehin nur in der Datenbank wieder herstellen. Da kannst Du also nicht viel ruinieren, ausserdem macht die "importieren-Funktion" von Phpmyadmin auch nichts anderes als den in Deinem Skript beschriebenen Befehl...</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 14:27:41 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771238#m1771238 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771238#m1771238 <p>Es gibt eine Datenbank, mit der man das erreichen kann, was Du wohl vorhast:</p> <p><a href="http://www.fa-technik.adfc.de/code/opengeodb/" rel="nofollow noopener noreferrer">http://www.fa-technik.adfc.de/code/opengeodb/</a></p> <p>Die erhält sogar Updates.</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 11:29:34 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771218#m1771218 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771218#m1771218 <p>Vielen Dank, den Wald vor lauter Bäumen nicht gesehen. Bei mir schwingen gerade die Bedenken mit, dass ich etwas gekauft habe, was totaler Schrott ist.</p> <p>Das hier steht im Code ...</p> <pre><code class="block language-php"><span class="token variable">$conn</span> <span class="token operator">=</span> <span class="token function">mysql_connect</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'127.0.0.1'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'root'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'db connect error: '</span> <span class="token operator">.</span> <span class="token function">mysql_error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Das gibt es doch gar nicht mehr, oder?</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 11:45:01 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771219#m1771219 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771219#m1771219 <p>Hi there,</p> <blockquote> <p>Vielen Dank, den Wald vor lauter Bäumen nicht gesehen. Bei mir schwingen gerade die Bedenken mit, dass ich etwas gekauft habe, was totaler Schrott ist.</p> </blockquote> <p>Naja, ich schätze einmal, Du hast in erster Linie für die Daten bezahlt, und nicht für die "genialen" Importroutinen.</p> <blockquote> <p>Das hier steht im Code ...</p> <pre><code class="block language-php"><span class="token variable">$conn</span> <span class="token operator">=</span> <span class="token function">mysql_connect</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'127.0.0.1'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'root'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'db connect error: '</span> <span class="token operator">.</span> <span class="token function">mysql_error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Das gibt es doch gar nicht mehr, oder?</p> </blockquote> <p>In einer Produktivitätsumgebung würde man soetwas nicht mehr machen, aber wenn's auf Deinem Server (der in dem Fall wahrscheinlich Dein Rechner ist) funktioniert, warum nicht? Du hast ja in erster Linie offenbar ein syntaktisches Problem, die fehlenden Semikola wurden ja schon erwähnt.</p> <p>Alternativ dazu kannst Du diese Befehle ja auch einzeln in Phpmyadmin im SQL-Abfragefenster einzeln eingeben, also zuerst erzeugst Du eine Datenbank (das entspricht vom Effekt her dem "USE db' (brauchst Du natürlich nur einmal machen), dann löscht Du mit 'DROP TABLE IF EXISTS plz_de' die Tabelle, sollte die von vorhergegangen Fehlversuchen schon existieren, dann erzeugst Du sie wieder mit dem 'CREATE TABLE...'-Befehl und so weiter, immer schön der Reihe nach...;)</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 12:07:17 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771221#m1771221 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771221#m1771221 <p>Vielen Dank!</p> <p>Die "100% verifizierten Daten" entsprechen auch nicht dem aktuellen Stand, allein in meinem Wohnort finde ich bereits einen Fehler.</p> <p>Ich habe ewig nichts mehr ge-HTML-t und ge-PHP-t und allein aufgrund der Sicherheit wollte ich auf etwas zurückgreifen, das gekauft und daher vermeintlich sicher ist. Jetzt kommt da so eine Scheiße bei raus.</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 12:28:25 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771223#m1771223 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771223#m1771223 <p>Hi there,</p> <blockquote> <p>Die "100% verifizierten Daten" entsprechen auch nicht dem aktuellen Stand, allein in meinem Wohnort finde ich bereits einen Fehler.</p> </blockquote> <p>Naja, das ist eine andere Geschichte…</p> <blockquote> <p>Ich habe ewig nichts mehr ge-HTML-t und ge-PHP-t und allein aufgrund der Sicherheit wollte ich auf etwas zurückgreifen, das gekauft und daher vermeintlich sicher ist. Jetzt kommt da so eine Scheiße bei raus.</p> </blockquote> <p>Ich hoffe, Du hast nicht viel dafür bezahlt. In welchem Format und wofür brauchst Du die Daten eigentlich?</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 12:41:21 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771224#m1771224 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771224#m1771224 <p>http://www.plz-umkreis.com/</p> <p>Stolze 99 Euro, ich denke, dass das viel Geld ist, ich habe aber keine Vergleichsmöglichkeiten.</p> <p>Ich wollte eine Umkreissuche integrieren. Ich bin mittlerweile mit WordPress verheiratet, wie gesagt, ich bin einfach nicht mehr ansatzweise auf der Höhe des Geschehens und kann das zeitlich auch nicht wieder aufholen, weil eben jene Zeit fehlt. Bei "British Virgin Islands" hätte ich wohl hellhörig werden müssen, jetzt ärgert es mich natürlich. Ich weiß auch nicht, wie hoch die Chance ist, das über PayPal zurück zu bekommen.</p> <p>Mir ist die Genauigkeiten gar nicht so wichtig, Erdkrümmung, etc., es geht mir da nicht um 5 Kilometer, aber eine fertige Lösung schien mir angebracht.</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 13:08:33 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771226#m1771226 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771226#m1771226 <p>Hi there,</p> <blockquote> <p>http://www.plz-umkreis.com/ Stolze 99 Euro, ich denke, dass das viel Geld ist, ich habe aber keine Vergleichsmöglichkeiten.</p> </blockquote> <p>Kann ich Dir nicht sagen, ich hab so etwas noch nie benötigt, aber für 99 Euro bekomm' ich schon eine Flasche von meinem <a href="http://www.massolino.it/vini/vigna-rionda/" rel="nofollow noopener noreferrer">Lieblingsbarolo</a> </p> <blockquote></blockquote> <blockquote> <p>Bei "British Virgin Islands" hätte ich wohl hellhörig werden müssen, jetzt ärgert es mich natürlich. Ich weiß auch nicht, wie hoch die Chance ist, das über PayPal zurück zu bekommen.</p> <p>Mir ist die Genauigkeiten gar nicht so wichtig, Erdkrümmung, etc., es geht mir da nicht um 5 Kilometer, aber eine fertige Lösung schien mir angebracht.</p> </blockquote> <p>Die 5 Kilometer sind eh nicht drin, ich habs ausprobiert, bei einem Radius von 10km hat mir diese Seite bei einer Testabfrage eine Strecke von 30 km als in der Lösung befindlich vorgeschlagen. Anyway, wie gesagt, da hast Du dann ja quasi zwei Probleme, den Datenimport, damit Du die Daten nutzen kannst und eine sinnvolle Abfrage, damit auch etwas Brauchbares 'rauskommt. Und letzteres bedeutet, daß Du Dich auch noch mit irgendeinem Skript herumschlagen kannst. Das schaut langsam wirklich nach Mühsal und Gewährleistung aus...;(</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 13:49:38 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771232#m1771232 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771232#m1771232 <p>Den Beitrag habe ich löschen lassen, vielen Dank für den Hinweis.</p> <p>Wie der leider ebenfalls gelöschte Beitrag von Rolf B vermuten lässt, ist das ganze Unterfangen für die Tonne. Bei mir läuft Php 7 und wie Rolf B bereits ausführte, sind einige Funktionen abgeschaltet.</p> <p>Bleibt vermutlich nur der Versuch, das Geld zurückzubekommen.</p> <p>Rolf Bs Hinweis (frag mal, wo er die Daten her hat) habe ich nicht verstanden.</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 14:07:57 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771235#m1771235 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771235#m1771235 <p>Hi there,</p> <blockquote> <p>Wie der leider ebenfalls gelöschte Beitrag von Rolf B vermuten lässt, ist das ganze Unterfangen für die Tonne. Bei mir läuft Php 7 und wie Rolf B bereits ausführte, sind einige Funktionen abgeschaltet.</p> </blockquote> <p>ja, die alte MySQL-API wurde afaik mit PHP7 entfernt. Das ließe sich zur Not aber leicht reparieren.</p> <blockquote> <p>Bleibt vermutlich nur der Versuch, das Geld zurückzubekommen.</p> </blockquote> <p>Richtig - die Frage ist, will man überhaupt herumreparieren, wenn man gerade frisch gekauft hat?</p> <blockquote> <p>Rolf Bs Hinweis (frag mal, wo er die Daten her hat) habe ich nicht verstanden.</p> </blockquote> <p>Keine Ahnung, vielleicht wollte er damit andeuten, daß Du die Daten (die bestehen ja im wesentlichen nur aus einer Postleitzahl und den entsprechenden Koordinaten) unter Umständen auch wo anders her beziehen könntest...</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 14:20:14 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771236#m1771236 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771236#m1771236 <p>Hallo Verzweifelt,</p> <blockquote> <p>ist das ganze Unterfangen für die Tonne. Bei mir läuft Php 7 und wie Rolf B bereits ausführte, sind einige Funktionen abgeschaltet.</p> </blockquote> <p>Nein, nur weil die mysql-Funktionen nicht mehr existieren, sind die Script nicht für den Eimer. Das ist sehr schnell auf mysqli umgestellt.</p> <p>Etwas programmieren musst Du ohnehin, um eine Umkreissuche auf deiner Seite einzubauen.</p> <p>Was mir nur auffiel - und was ich wegen der Löschung nicht mehr speichern konnte: Die Formel im SQL und die Formel auf deren Supportseite stimmen nicht überein. Auf der Supportseite steht die <a href="https://de.wikipedia.org/wiki/Orthodrome" rel="nofollow noopener noreferrer">Orthodrome-Formel</a>, die man auch in der Wikipedia findet. Das ist der Arcuscosinus des Öffnungswinkels zwischen den beiden Punkten. Im SQL steht aber irgendwas mit Wurzel und überhaupt kein Arcuscosinus, das scheint eine Näherungsformel zu sein. Dabei hat mysql eine ACOS-Funktion, aber vielleicht ist sie ihnen zu langsam.</p> <p>Abgesehen davon kommt mir das SQL sehr ineffizient vor. Wenn man effizienter sein will, dann sollte man nicht eine Näherungsformel für den Arcuscosinus verwenden, sondern</p> <ul> <li>sin/cos der eingegebenen Länge und Breite vorab berechnen und als Literal ins SQL einsetzen</li> <li>sin/cos von latitude und longitude vorberechnet in die Tabelle einsetzen. Dann steht da nicht mehr <code>SIN(RADIANS(geodb.longitude))</code>, sondern <code>geodb.sin_long</code>. Erweitere die plz_de Tabelle um vier float-Spalten: sin_long, cos_long, sin_lat, cos_lat, und mach einen Update-Befehl, der diese 4 Inhalte aus latitude und longitude berechnet.</li> <li>Ein Prefixing mit geodb ist übrigens auch nicht nötig, wenn man nur eine Tabelle verwendet, und es passt bei Dir auch nicht, weil deine Tabelle gar nicht geodb heißt, sondern plz_de.</li> </ul> <p>Es hilft auch, zwei SELECTs zu schachteln. Der innere berechet die Abstände, der äußere filtert, dann muss man die Abstandsformel nur einmal notieren.</p> <p>Im SQL wird's dann deutlich übersichtlicher. Ich verwende jetzt die Orthodrome-Formel aus der Wikipedia statt der Näherungsformel.</p> <p>In $sinLong, $sinLat, $cosLong und $cosLat stehen die vorberechneten Sin-/Cos-Werte der Bezugs-PLZ.</p> <pre><code class="block">SELECT p.plz, p.ort, p.abstand FROM (SELECT plz, ort, 6367.41 * ACOS( sin_lat * $sinLat + cos_lat * $cosLat * COS(RADIANS($long - longitude)) ) AS abstand FROM plz_de) p WHERE p.abstand < $radius </code></pre> <p>Eine echte Cosinusberechnung ist noch nötig. Es sei denn, du machst es wie im Beispiescript und verwendest das Additionstheorem für cos(a-b)=cosa cosb + sina sinb - dann kannst Du weiter die vorberechneten Werte verwenden. Könnte schneller sein, muss man einfach mal messen.</p> <p>Wenn Dir das zu wüst wird, ok, dann solltest Du mit dem Support von plz_umkreis zusammenarbeiten. Die lassen sich ja auf ihrer Homepage für ihren Support feiern.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 14:21:21 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771237#m1771237 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771237#m1771237 <p>Hallo klawischnigg,</p> <p>genau - ich meine nämlich, dass eine PLZ - Koordinaten Tabelle auch frei verfügbar ist. Ich weiß nur nicht wo.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 23:25:16 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771263#m1771263 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771263#m1771263 <p>Vielen Dank schon einmal, nur kurz zum Support ...</p> <p>https://www.trustpilot.com/review/www.zipcodesoft.com</p> <p>Aus diesem Grund denke ich auch, dass ich beschubst wurde. Neben alten Daten und einem völlig verhurten Skript reagiert bisher niemand.</p> Ausführen eines SQL-Befehls, um ein Script zum Laufen zu bringen Fri, 29 May 20 14:35:19 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771239#m1771239 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771239#m1771239 <p>Hi there,</p> <blockquote> <p>genau - ich meine nämlich, dass eine PLZ - Koordinaten Tabelle auch frei verfügbar ist. Ich weiß nur nicht wo.</p> </blockquote> <p>Ja, das ist das Problem, oder wie es ein bedeutender österreichischer Kabarettist (ja, sowas gibts auch) einmal formuliert hat: "das Leben ist wie ein Supermarkt, theoretisch wäre alles da, aber man weiß halt nicht wo..." </p> Installationsanleitung für opengeodb Fri, 29 May 20 15:11:21 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771240#m1771240 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771240#m1771240 <p>Schritt für Schritt:</p> <p>1. aktuelle Adresse des letzten Dumps auf</p> <p><a href="http://www.fa-technik.adfc.de/code/opengeodb/dump/" rel="nofollow noopener noreferrer">http://www.fa-technik.adfc.de/code/opengeodb/dump/</a></p> <p>heraussuchen. Bei war das http://www.fa-technik.adfc.de/code/opengeodb/dump/opengeodb-02630_2020-04-13.sql.gz</p> <p>2.</p> <pre><code class="block language-sh"><span class="token builtin class-name">cd</span> /tmp <span class="token function">wget</span> <span class="token string">'http://www.fa-technik.adfc.de/code/opengeodb/dump/opengeodb-02630_2020-04-13.sql.gz'</span> </code></pre> <p>3. <strong>Nur für MariaDB</strong>!:</p> <pre><code class="block language-sh"><span class="token function">sed</span> <span class="token parameter variable">-e</span> <span class="token string">'s/TYPE=InnoDB CHARACTER SET utf8//'</span> <span class="token operator"><</span> <span class="token string">'opengeodb-02630_2020-04-13.sql'</span> <span class="token operator">></span> <span class="token string">'opengeodb-02630_2020-04-13.sql.1'</span> </code></pre> <p>4. Mysql/Mariadb als root</p> <pre><code class="block language-sh">mysql <span class="token punctuation">[</span>-u root -p<span class="token punctuation">]</span> </code></pre> <p>5. in der Mysql-Shell</p> <pre><code class="block language-mysql">create database `opengeodb_2020`; quit; </code></pre> <ol start="6"> <li>in der Shell als root (Mariadb, Ubuntu)</li> </ol> <p><strong>Bitte beachten, dass das Einlesen des Dumps eine ganze Weile dauern kann!</strong></p> <pre><code class="block language-sh">mysql opengeodb_2020 <span class="token operator"><</span> opengeodb-02630_2020-04-13.sql.1 </code></pre> <p>oder (andere, die Passwort erfordern, dann ohne root-Rechte:)</p> <pre><code class="block language-sh">mysql <span class="token parameter variable">-u</span> root <span class="token parameter variable">-p</span> opengeodb_2020 <span class="token operator"><</span> opengeodb-02630_2020-04-13.sql.1 </code></pre> <p>7. <a href="https://dev.mysql.com/doc/refman/8.0/en/grant.html" rel="nofollow noopener noreferrer">mit Grant-Befehl Rechte vergeben.</a></p> OpenGeoDB - Umkreissuche Fri, 29 May 20 15:15:57 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771241#m1771241 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771241#m1771241 <p>Dieses Fahrrad wurde schon oft erfunden...</p> <p><a href="http://opengeodb.org/wiki/OpenGeoDB_-_Umkreissuche" rel="nofollow noopener noreferrer">http://opengeodb.org/wiki/OpenGeoDB_-_Umkreissuche</a></p> Installationsanleitung für opengeodb Fri, 29 May 20 15:26:36 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771242#m1771242 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771242#m1771242 <p>Hallo Raketenwissenschaftler,</p> <blockquote> <p>Nur für MariaDB!: sed -e...</p> </blockquote> <p>Nicht nur für MariaDB. Die Table Option TYPE=... heißt schon seit Ewigkeiten ENGINE=, und seit MySQL 5.5 wird nur noch ENGINE unterstützt.</p> <blockquote> <p><strong>Bitte beachten, dass das Einlesen des Dumps eine ganze Weile dauern kann!</strong></p> </blockquote> <p>Die Untertreibung des Jahres! Das läuft bei mir jetzt schon 12 Minuten und ist, wie es aussieht, bei 3 Prozent oder so. Ok, das ist MySQL 5.6, und eine Magnetplatte, und ein einfacher Desktop. Aber CPU ist kaum gefragt, dafür ist meine Platte am Rauchen. 99% Auslastung, keine sonderlich hohe Schreibrate, offenbar ist dieses Script extrem ineffizient. Massendaten importiert man nicht per INSERT, sondern anders. Gibt's da keine bessere Quelle?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Installationsanleitung für opengeodb Sat, 30 May 20 07:37:02 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771268#m1771268 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771268#m1771268 <p>Vorab vielen Dank natürlich! Ich bin entweder komplett eingestaubt oder früher war das einfacher, vielleicht auch beides.</p> <p>Liegt die Ursache in der TYPE - ENGINE-Geschichte, dass ich beim Import permanent Fehlermeldungen angezeigt bekomme? Bzw: Einen Schritt zurück ...</p> <p>Ich habe vom Provider zwei Datenbanken, der lasse ich</p> <pre><code class="block">create database `opengeodb_2020`; quit; </code></pre> <p>weg und verwende einfach eine der beiden bestehenden Datenbanken, um Daten dieser Seite: http://www.fa-technik.adfc.de/code/opengeodb/</p> <p>zu importieren.</p> <p>Mir erschien die opengeodb-begin.sql als sinnvoll, weil die ja die Tabellen erstellen soll, die danach gefüllt werden sollen. Da erscheint bei mir die Fehlermeldung</p> <pre><code class="block">#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei 'TYPE=InnoDB CHARACTER SET utf8' in Zeile 10 </code></pre> <p>Es tut mir wirklich leid, dass ich gerade die einfachsten Schritte nicht mehr hinbekomme. Aber in Zeile 10 ist doch einfach nur ein Kommentarsternchen.</p> Installationsanleitung für opengeodb Sat, 30 May 20 08:10:44 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771270#m1771270 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771270#m1771270 <p>Wie Rolf schon schrieb:</p> <p>Das <code>TYPE=InnoDB CHARACTER SET utf8</code> in den Dateien von der Quelle ist nicht nur <code>hyperliquid</code> sondern ein Syntaxfehler - der entsteht, weil die Dumps offensichtlich mit einer schwer veralteten MySQL-Version gemacht wurden. Sowas kommt vor…</p> <blockquote> <p>Nicht nur für MariaDB. Die Table Option TYPE=... heißt schon seit Ewigkeiten ENGINE=, und seit MySQL 5.5 wird nur noch ENGINE unterstützt.</p> </blockquote> <p>In solchen Fällen vergleicht man die Fehlermeldung einfach mal mit dem Quelltext. Zeilenummern sind hierbei "Schall und Rauch", weil für MySQL offenbar eine Zeile etwas ganz anderes ist als für Dich…</p> <p><strong>Die Lösung hattest Du eigentlich schon vor Augen:</strong></p> <p>Man schaut sich den Quelltext an und überlegt, was den Fehler verursacht. Danach, ob man es weglässt oder ersetzt. Im ersten Beispiel hatte ich mich für "Weglassen" entschieden, da Du aber eine Datenbank eines Providers benutzt kann die „wunderbunt“ konfiguriert sein (und merkwürdige Voreinstellungen haben) also schlage ich jetzt "Ersetzen" vor.</p> <p>Das Handbuch sagt:</p> <pre><code class="block">ENGINE=InnoDB CHARACTER SET utf8 </code></pre> <p>wird erwartet.</p> <p>Du kannst das mit einem Editor beheben (Suchen nach 'TYPE=InnoDB', Ersetzen durch 'ENGINE=InnoDB') oder kurzerhand <code>sed</code> nehmen und genau das (in einer Linux-Shell/SSH-Sitzung) machen:</p> <pre><code class="block language-sh"><span class="token function">sed</span> <span class="token parameter variable">-e</span> <span class="token string">'s/TYPE=InnoDB/ENGINE=InnoDB/'</span> <span class="token operator"><</span> <span class="token string">'datei.sql'</span> <span class="token operator">></span> <span class="token string">'datei.neu.sql'</span> </code></pre> <p>Das sollte "eng genug" sein um sonst nichts zu verändern.</p> <p>Danach natürlich die neue Datei einlesen.</p> Installationsanleitung für opengeodb Sat, 30 May 20 08:34:48 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771272#m1771272 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771272#m1771272 <p>Übrigens, falls Du eine Umkreissuche mit Postleitzahlen bauen willst, da gibt es eine fertige Datei, welche die Postleitzahlbereiche mit Koordinaten enthält. Die könnte Dir genügen.</p> <p>http://www.fa-technik.adfc.de/code/opengeodb/PLZ.tab</p> <p>Du kannst Dir also selbst eine Tabelle bauen (die <code>opengeodb-begin.sql</code> enthält bis auf die veraltete Syntax alles was Du dazu brauchst), die Daten dann einlesen (sieh Dir dazu <a href="https://www.mysqltutorial.org/import-csv-file-mysql-table/" rel="nofollow noopener noreferrer">https://www.mysqltutorial.org/import-csv-file-mysql-table/</a> an) und nicht vergessen die Tabelle zu indizieren, damit die Abfragen schnell gehen. Wie das geht, kannst Du Dir in der Dir ebenfalls schon bekannten <code>opengeodb-end.sql</code> anschauen.</p> <p>Das geht mit Lesen, Vergleichen und dem Mittel einfacher Überlegung…</p> Installationsanleitung für opengeodb Sat, 30 May 20 16:57:56 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771301#m1771301 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771301#m1771301 <p>Das scheint schon mal geklappt zu haben, vielen Dank<img src="/images/a8fa87be-a296-11ea-bd92-b42e9947ef30.jpg" alt="" loading="lazy"></p> Installationsanleitung für opengeodb Sun, 31 May 20 07:53:53 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771326#m1771326 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771326#m1771326 <p>Die PLZ.tab gibt es ja nicht als CSV-Datei. Eine entsprechende Tabelle habe ich (hoffentlich korrekt) angelegt, aber der Import der PLZ.tab funktioniert noch nicht bzw. ich finde dazu auch nichts im Netz. Ich habe auch versucht, die .tab in einer CSV-Datei konvertieren, auch das gelingt mir nicht.</p> Umkreissuche Sun, 31 May 20 08:17:23 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771328#m1771328 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771328#m1771328 <p>Zur Performance:</p> <p>Alle reinen SQL-Abfragen zur Umkreissuche bedienen sich „fürchterlich komplizierter“ mathematischer Formeln.</p> <ul> <li>Das hat den Nachteil, dass die Indexe nicht benutzt werden können. Das geht also vergleichbar langsam.</li> </ul> <p>Mein Trick für die Umkreissuche ist, je nach Radius ein Koordinatenviereck zu berechnen, und sich dann also in einem ersten Schritt die 10 bis 200 Orte aus dem Viereck geben zu lassen und dann nur diese mit der „fürchterlich komplizierten“ mathematischen Formel darauf zu untersuchen, ob diese im wohl auch im Umkreis liegen. <a href="http://www.dbinterface.de/geo/" rel="nofollow noopener noreferrer">Das geht dann in „hastdunichtgesehen"</a>.</p> <p>Außerdem kannst Du bei einer solchen Umkreissuche und bei Radien bis 30 Kilometer durchaus auch die Erdkrümmung vernachlässigen. Die anderen, bei der Beechnung über Koordinaten nicht behebbaren Mängel (Wie wird denn die Koordinate der PLZ festgelegt?; Kein direkter Weg bei Gebieten links und rechts großer Flüsse?; Die Erde ist eher eine schrumpelige Kartoffel als eine Kugel!; …) wiegen bei kleinen Radien schwerer als die hierdurch auftretenden Ungenauigkeiten. Nur Genauheimer aus der nordeutschen Flachebene bestehen auf der Kugel und der reinen Geometrie.</p> <p>Wir hatten hier im Forum dazu schon jede Menge Diskussionen, Du kannst dennoch fragen.</p> Installationsanleitung für opengeodb Sun, 31 May 20 08:14:07 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771327#m1771327 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771327#m1771327 <p>Hallo,</p> <blockquote> <p>Ich habe auch versucht, die .tab in einer CSV-Datei konvertieren,</p> </blockquote> <p>Und zwar wie?</p> <p>Das sollte mit jedem beliebigen Tabellenprogramm gelingen. In meinem Versuch war es aber wichtig, vorher dem Firefox zu sagen, dass er die .tab als <s>utf</s> unicode anzeigen soll, sonst gabs <code>eßhüb</code>-Chaos…</p> <p>Machen andere Browser das besser?</p> <p>Gruß<br> Kalk</p> Installationsanleitung für opengeodb Sun, 31 May 20 08:31:52 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771330#m1771330 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771330#m1771330 <blockquote> <p>Die PLZ.tab gibt es ja nicht als CSV-Datei.</p> </blockquote> <p>Oh doch!</p> <p>CSV heisst <s>Comma</s> Character Separated Values. Das Trennzeichen ist hier der Tabulator. (Deswegen „.tab“)</p> <p>Für den Immport der Datei von http://www.fa-technik.adfc.de/code/opengeodb/PLZ.tab gilt also:</p> <pre><code class="block">Auszulassende Zeilen: 1 Zeilentrenner : \n (Unix) Spaltentrenner : \t Textbegrenzer : keine Textkodierung: : utf-8 </code></pre> Installationsanleitung für opengeodb Sun, 31 May 20 09:35:05 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771333#m1771333 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771333#m1771333 <p>Ich habe die passende Tabelle aus der Tab-Datei mal eben erstellt:</p> <p>https://home.fastix.org/Files/free_for_all/opengeodb_PLZ_Koordinates.sqlite3</p> <p>Beachte bitte, dass sqlite(3) nicht mysql und mariadb ist. <a href="https://www.php.net/manual/de/book.sqlite3.php" rel="nofollow noopener noreferrer">Aber PHP unterstützt das auch</a>. <a href="https://www.php.net/manual/de/ref.pdo-sqlite.php" rel="nofollow noopener noreferrer"><strong>Ich würde aber die PDO-Variante nehmen</strong></a>.</p> <p>sqlite3 bietet sich hier an, weil es mit dem wenigen Datensätzen gut zu recht kommt und in der Tabelle im produktiven Einsatz nicht geschrieben, sondern nur gelesen wird...</p> Installationsanleitung für opengeodb Sun, 31 May 20 08:23:16 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771329#m1771329 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771329#m1771329 <blockquote> <p>Machen andere Browser das besser?</p> </blockquote> <p>Definiere „besser“ - Der Browser trifft eine Annahme weil ihm nichts zu den Eigenschaften mitgeteilt wird.</p> <pre><code class="block">HTTP/1.1 200 OK Date: Sun, 31 May 2020 08:19:54 GMT Server: Apache Last-Modified: Tue, 07 Feb 2017 15:39:39 GMT ETag: "2f214ce-71c1a-547f28e57ff66" Accept-Ranges: bytes Content-Length: 465946 X-Powered-By: PleskLin Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Language: de </code></pre> <p>Das wäre also Sache des Betreibers der Webseite.</p> Umkreissuche - die nächsten Schritte Sun, 31 May 20 11:24:53 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771340#m1771340 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771340#m1771340 <p>Wie also weiter?</p> <p>Zunächst solltest Du erfahren, ob Dein Hoster sqlite3 unterstützt. Den kann man fragen und warten, oder das einfach mal testen. Lade die Datei opengeodb_PLZ_Koordinates.sqlite3 in ein Verzeichnis, dessen Inhalt der Webserver nicht ausliefert (ich hab das in einem Terminal gemacht und einfach mal /tmp/ genommen), passe den Pfad an und teste einfach mal…</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token function">error_reporting</span><span class="token punctuation">(</span> <span class="token constant">E_ALL</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">ini_set</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'display_errors'</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$dbh</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'sqlite:/tmp/opengeodb_PLZ_Koordinates.sqlite3'</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ATTR_PERSISTENT</span> <span class="token operator">=></span> <span class="token constant boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">trigger_error</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Verbindung fehlgeschlagen: '</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">E_USER_ERROR</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'SELECT ort FROM PLZ ORDER BY ort_sort_at DESC LIMIT 3'</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$res</span> <span class="token operator">=</span> <span class="token variable">$dbh</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span> <span class="token variable">$sql</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">PDOException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">trigger_error</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'Abfrage fehlgeschlagen: '</span> <span class="token operator">.</span> <span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">E_USER_ERROR</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">header</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Content-type: text/plain; charset=utf-8'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$res</span> <span class="token keyword">as</span> <span class="token variable">$row</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">print</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'ort'</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>Wenn das klappt kannst Du ja mit der Abfrage ein wenig herumspielen...</p> Fürchterlich komplizieter Umkreissuche Sun, 31 May 20 15:05:59 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771343#m1771343 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771343#m1771343 <p>Hallo Raketenwissenschaftler,</p> <p>einerseits hast Du Recht - die Voreinschränkung mit einem „Quadrat“ hilft schonmal gewaltig. D.h. man findet zuerst mal die Intervalle, in denen Längen- und Breitengrad liegen müssen, um überhaupt im Radius enthalten sein zu können.</p> <p>Für die Breite ist es relativ einfach, der Abstand zwischen zwei Breitengraden beträgt näherungsweise 40000km / 360 = 111.111 km. Bei den Längengraden ist es komplizierter, der Abstand zwischen zwei Längengraden hängt von der Breite ab. Der Radius der "Erdscheibe" in einem bestimmten Breitengrad $$\phi$$ beträgt $$r_\phi = r_E \cos \phi$$, und da der Umfang zum Radius proportional ist, gilt das auch für den Umfang der Erde an diesem Breitengrad. Demnach ist der Abstand zweier Längengrade auf Breite $$\phi$$: $$l_\phi = 111,111 \cos \phi$$. Bleibt man in Deutschland, liegt der südlichste Punkt an der Oberstdorfer Trifthütte, $$\phi=47{,}27^\circ$$, und einem Längengradabstand von 75,4km. Der nördlichste Punkt liegt im Rickelsbüller Koog auf 54,9 Grad mit einem Längengradabstand von 63,9km.</p> <p>Andererseits kann man sich durch passende Vorausberechnungen auch viel Rechnerei sparen. Ich schrub das ja schon anderswo.</p> <p>Vorausberechnung Stufe 1: sin und cos von Länge und Breite jedes gespeicherten Ortes bestimmen und in der Ortstabelle abspeichern. Das kann man ab MySQL 5.7 mit generated columns lösen (aber STORED, nicht VIRTUAL, sonst ist's witzlos). Ebenso sin und cos von Länge und Breite des Referenzortes bestimmen.</p> <p>Die Abstandsformel für Orthodrome steht in der Wikipedia. Sie basiert auf dem Zentriwinkel, d.h. dem Winkel zwischen den beiden Geraden vom Erdmittelpunkt zu den beiden Punkten, deren Abstand zu finden ist. Der Cosinus des Zentriwinkels berechnet sich so:</p> <p>$$\cos \zeta = \sin(\phi_A) \cdot \sin(\phi_B) + \cos(\phi_A) \cdot \cos(\phi_B) \cdot \cos(\lambda_B - \lambda_A)$$</p> <p>Das unschöne an dieser Formel ist, dass man den Cosinus der Differenz der Längengrade ausrechnen muss, was sich nicht vorberechnen lässt. Aber Mathematik ist ja die Kunst, das Rechnen zu vermeiden , darum wenden wir zuerst einmal das Additionstheorem für $$\cos(\beta - \alpha)$$ an:</p> <p>$$\cos \zeta = \sin(\phi_A) \cdot \sin(\phi_B) + \cos(\phi_A) \cdot \cos(\phi_B) \cdot (\cos\lambda_B \cos\lambda_A + \sin\lambda_B \sin\lambda_A) $$</p> <p>Die Distanz d der beiden Punkte A und B ist $$d = r\cdot\zeta$$, mit r=Erdradius und $$\zeta = \arccos(...)$$ (im Bogenmaß) entsprechend der obigen Formel.</p> <p>Nun muss man alle Orte finden, für die d einen bestimmten Abstand A unterschreitet. Das führt wieder zu einer Lästigkeit, denn das Berechnen des arccos in der SQL Abfrage ist ebenfalls zeitraubend. Also nutzen wir den bekannten Umstand, dass die arccos-Funktion zwischen x=-1 und x=1 streng monoton fallend ist, dementsprechend gilt</p> <p>$$ \displaystyle \quad\quad r \cdot \zeta \lt A$$<br> $$ \displaystyle \Longleftrightarrow \zeta \lt \frac{A}{r}$$<br> $$ \displaystyle \Longleftrightarrow \cos \zeta \gt \cos\frac{A}{r}$$</p> <p>Diesen Cosinus kann man wieder vorausberechnen. In der Query berechnet man dann nur noch den Wert innerhalb des arccos-Aufrufs, was 5 Multiplikationen und 2 Additionen sind, und vergleicht ihn mit dem vorausberechneten Referenzwert. Achtung, es ist ein GRÖSSER-Vergleich, weil arccos eine fallende Funktion ist.</p> <p>Die Hardcore-Lösung wäre übrigens, eine Tabelle mit allen möglichen PLZ Paaren zu bilden und darin den Abstand dieser PLZ zu speichern. Das dauert eine Weile, aber das kann man nach jedem Update der PLZ DB einmal machen und die Abfragen gehen dann Ratz-Superfatz direkt auf den Index, wenn man nach "Von-PLZ" und "Abstand" Indexiert. Das sind 67 Millionen bis 841 Millionen Sätze, je nachdem, ob man nur die 8200 Hauszustellungs-PLZ will oder auch die 16500 Postfach- oder 3100-Großempfänger-PLZ berücksichtigen will. Ob sich das lohnt, hängt vom Mengengerüst der erwarteten Abfragen ab.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Installationsanleitung für opengeodb Sun, 31 May 20 08:38:39 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771331#m1771331 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771331#m1771331 <p>Hallo,</p> <blockquote> <p>CSV heisst <s>Comma</s> Character Separated Values.</p> </blockquote> <p>Immer diese fiesen Uminterpretationen, die einem das Leben einfacher machen…</p> <p>Gruß<br> Kalk</p> In der reinen Lehre Sun, 31 May 20 08:45:54 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771332#m1771332 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771332#m1771332 <blockquote> <blockquote> <p>CSV heisst <s>Comma</s> Character Separated Values.</p> </blockquote> <p>Immer diese fiesen Uminterpretationen, die einem das Leben einfacher machen…</p> </blockquote> <p>In der reinen Lehre des Mahrad Tschumbeldingda bedeutet CSV allerdings Character Separated Valottes, also "rauhe Typen mit unterschiedlichem Karma"</p> Hinweis eines Moderators Sun, 31 May 20 09:49:23 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771334#m1771334 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771334#m1771334 <p>Hallo Jörg,</p> <p>du solltest dir noch mal den Unterschied zwischen „Autor“ und „Betreff“ klarmachen.</p> <p>Gruß<br> Jürgen</p> Aktualisierte Datei Sun, 31 May 20 09:55:17 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771335#m1771335 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771335#m1771335 <blockquote> <p>Ich habe die passende Tabelle aus der Tab-Datei mal eben erstellt:</p> <p>https://home.fastix.org/Files/free_for_all/opengeodb_PLZ_Koordinates.sqlite3</p> </blockquote> <p>Aktualisierte Variante mit Zusatzspalte für Telefeonbuchsortierung (z.B. „Ö“→„oe“) hoch geladen. (Gleiche Stelle)</p> Hinweis eines Moderators Sun, 31 May 20 09:57:52 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771336#m1771336 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771336#m1771336 <blockquote> <p>du solltest dir noch mal den Unterschied zwischen „Autor“ und „Betreff“ klarmachen.</p> </blockquote> <p>Du meinst sicherlich „aufmerksamer beachten“.</p> Software für sqlite3 Sun, 31 May 20 10:18:45 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771337#m1771337 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771337#m1771337 <p>GUI für sqlite(3):</p> <p>https://sqlitebrowser.org/</p> <p>Pakete für Linux</p> <p>php-sqlite3 *) sqlite3 sqlite3-doc sqlitebrowser sqlite3-pcre +)</p> <p>*) Das Paket „php-sqlite3“ wird Dein Hoster wohl installiert haben. +) Wenn mit sqlite3 Perl-kompatible reguläre Ausdrücke genutzt werden sollen…</p> Aktualisierte Datei Sun, 31 May 20 10:49:16 Z https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771338#m1771338 https://forum.selfhtml.org/self/2020/may/29/ausfuhren-eines-sql-befehls-um-ein-script-zum-laufen-zu-bringen/1771338#m1771338 <p>Aktualisierte Variante mit Zusatzspalte für Lexikon-Sortierung (z.B. „Ö“→„o“) hoch geladen. (Gleiche Stelle)</p>