Komplizierte MYSQL-Abfrage
Komplizierte MYSQL-Abfrage
am 19.05.2006 14:24:47 von Klaus Lewohn
Hallo,
mein Problem ist folgendes:
In einer MYSQL-DB gibt es eine Tabelle mit Datensätzen für Kunden. Diese
erfassen in einem Feld die Ortsnamen ihres einzugsgebietes. Gespeichert
werde die mit '#' als Trennzeichen, zum Beispiel kann ein Feld dann
folgenden Inhalt haben:
Berlin#Hamburg#München#Bremen#Cuxhaven
Die Ortsnamen können sich in verschiedenen Datensätzen wiederholen, wenn ein
anderer Kunde in dem Feld z. B.
Hamburg#Freiburg#Stuttgart#Frankfurt
speichert.
Nun möchte ich gern alle Ortsnamen aus der Datenbank auslesen und aus einer
anderen Datenbank die jeweils ersten beiden Stellen der Postleitzahl und das
Bundesland hinzufügen, so daßß ich dann eine Liste habe wie
99... Freiburg, BW
88... Hamburg, HH
77... Frankfurt, HES usw.
Diese Ausgabe wiederum soll nach Ortsnamen sortiert sein.
Wenn ich anfangs die Ortsnamen auslese und mit explode in ein Array
schreibe, kann ich auch die übrigen Aktionen ausführen - so weit, so gut.
Aber ich bekomme keine Sortierung hin, weil mit jedem Kundensatz das
auslesen wieder neu beginnt. Ich hoffe, dass ich das einigermaßen erklären
konnte ;-)
Hier mal der Code dazu:
$res1=mysql_db_query("$dbname","SELECT einzugsorte FROM daten") or
die(mysql_error());
while(list($einzug) = mysql_fetch_row($res1)) {
$res=explode("#", $einzug);
$orte = array_unique($res);
$anz = count($orte);
for ($i=0; $i<$anz; $i++) {
$aktort=$orte[$i];
$db2 = mysql_pconnect($host, $user, $passwd);
$dbi2 = mysql_select_db("$db_database",$db2);
$res2=mysql_db_query("$db_database","SELECT plz, ort, land FROM PLZ WHERE
ort LIKE '$orte[$i]%' Limit 1")
or die(mysql_error());
while(list($plz, $ort, $land) = mysql_fetch_row($res2)) {
$liste[] = "$ort";
}
}
}
$liste = array_values(array_unique($liste));
for ($i=0; $i<$anz; $i++) {
$alleorte = $liste[$i];
echo "$liste[$i]
";
}
Irgendwie müsste ich es hinkriegen, dass die Abrageergebnisse erst in einem
Array zwischengespeichert, hinterher zusammengefügt und sortiert werden.
Außerdem soll in der Endausgabe jeder Ort nur einmal enthalten sein. Das
beomme ich einfach nicht hin.
Wie kann das funktionieren?
Besten Dank von Klaus
Re: Komplizierte MYSQL-Abfrage
am 19.05.2006 14:51:39 von Carsten Heinrich
Am Fri, 19 May 2006 14:24:47 +0200 schrieb Klaus Lewohn:
> Wie kann das funktionieren?
Indem du dich erstmal intensiv mit der Normalisierung von Datenbanken
(http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29 ) beschäftigst.
Tipp: Deine Speicherung mehrerer Ortsnamen in einem Feld verstößt bereits
gegen die erste Normalform.
Gruß
Carsten
Re: Komplizierte MYSQL-Abfrage
am 19.05.2006 14:53:02 von Alex Hepp
Klaus Lewohn schrieb:
> Hallo,
>
> mein Problem ist folgendes:
>
> In einer MYSQL-DB gibt es eine Tabelle mit Datensätzen für Kunden. Diese
> erfassen in einem Feld die Ortsnamen ihres einzugsgebietes. Gespeichert
> werde die mit '#' als Trennzeichen, zum Beispiel kann ein Feld dann
> folgenden Inhalt haben:
> Berlin#Hamburg#München#Bremen#Cuxhaven
Hast Du da Einfluss drauf? Sieht für mich nicht gerade nach gelungener
Normalisierung aus ;)
> Diese Ausgabe wiederum soll nach Ortsnamen sortiert sein.
>
> Wenn ich anfangs die Ortsnamen auslese und mit explode in ein Array
> schreibe, kann ich auch die übrigen Aktionen ausführen - so weit, so
> gut. Aber ich bekomme keine Sortierung hin, weil mit jedem Kundensatz
> das auslesen wieder neu beginnt. Ich hoffe, dass ich das einigermaßen
> erklären konnte ;-)
Also, wenn ich das richtig verstehe, ist Dein Problem, dass Du gerne aus
2 verschiedenen Datenbanken diese Informationen haben möchtest...
Mal abgesehen davon, dass ich ein etwas anderes DB-Design, sowie
Spaghetticode wie unten den vermeiden würde, rate ich Dir, Dir für die
Orte eine Klasse zu bauen, die dann die 3 Eigenschaften enthält, sowie
eine compare-Methode, die eine andere Instanz der Klasse Ort erhält.
Diese gibt dann -1 (das übergebene Objekt ist kleiner), 0 (beide sind
gleich) oder 1(das übergebene ist größer) zurück.
Jetzt schaust Du Dir mal die Funktion "uasort", bzw. usort etwas genauer
an. Dieser gibst Du dann eine weitere Funktion mit, die du schreibst...
Diese kann entweder in eine anderen Klasse residieren, oder eben einfach
eine Function sein.
Mit dieser vergleichst Du dann die Items, indem Du compare aufrufst und
den Rückgabewert einfach weiter gibst.
In etwa so (PHP4, quickhack):
------------
[code]
class Ort{
var $ortsname;
var $plz;
var $bundesland;
function compare($compareObject)
{
if ($this->ortsname == $compareObject->ortsname) {
return 0;
}
return ($this->ortsname < $compareObject->ortsname) ? -1 : 1;
}
}
// static function
function compareOrte($ort1,$ort2){
return $ort1->compare($ort2);
}
$ortArr = array();
// bilde dein Array zusammen
// Jedes Element enthält dann die einzelnen Eigenschaften.
usort($ortArr,"compareOrte");
?>
[/code]
-------------
> [...]Außerdem soll in der Endausgabe jeder Ort nur einmal enthalten
> sein. Das beomme ich einfach nicht hin.
Ändere Dein DB-Modell ;) Ernsthaft: Du läufst jedes Element eh durch.
Die Funktion in_array hilft Dir hier bestimmt weiter... Aber performant
ist das nicht!
Viel spass!
HTH
alex
Re: Komplizierte MYSQL-Abfrage
am 19.05.2006 17:00:18 von Christian Schmelzer
Klaus Lewohn wrote:
> Hallo,
>
> mein Problem ist folgendes:
>
> In einer MYSQL-DB gibt es eine Tabelle mit Datensätzen für Kunden.
> Diese erfassen in einem Feld die Ortsnamen ihres einzugsgebietes.
> Gespeichert werde die mit '#' als Trennzeichen, zum Beispiel kann ein
> Feld dann folgenden Inhalt haben:
> Berlin#Hamburg#München#Bremen#Cuxhaven
>
> Die Ortsnamen können sich in verschiedenen Datensätzen wiederholen,
> wenn ein anderer Kunde in dem Feld z. B.
> Hamburg#Freiburg#Stuttgart#Frankfurt
> speichert.
>
[...]
>
> Wie kann das funktionieren?
>
Hallo,
ändere dein Datenbank Design, alle anderen Lösungen sind Murks.
Christian
Re: Komplizierte MYSQL-Abfrage
am 21.05.2006 14:05:03 von Bernd Eichelsdorf
Anderer Tipp:
Lern erstmal richtiges DB-Design -
wenn man das richtig macht, erhält man sofort ein Design in der
5. Normalform, und muss sich nicht erst noch nachträglich mit
Normalisierung beschäftigen...
Ein gutes Skript dazu, findest du z.B. hier:
http://www.jeckle.de/vorlesung/datenbanken/script.html
Bernd