Schwierige SQL-Abfrage

MySQL, PostgreSQL, SQLite
jack88
Posts: 67
Joined: 2002-12-19 13:41

Schwierige SQL-Abfrage

Post by jack88 » 2003-05-24 18:04

Hallo,

ich habe zwei Tabellen. Tabelle 1 beinhaltet eine Liste mit Rufnummern, Tabelle 2 beinhaltet eine Liste mit Vorwahlen und den dazugehörenden Ländern.
Die Rufnummer in Tabelle 1 wird inklusive Vorwahl in einem Feld gespeichert.
Nun möchte ich jeder Rufnummer anhand der Tabelle 2 die entsprechende Vorwahl zuordnen.

Um die Vorwahl aus Tabelle 2 mit der Vorwahl in der Rufnummer in Tabelle 1 zu vergleichen benutze ich dann die folgende Abfrage:

SELECT * FROM Tabelle1 as t1,Tabelle2 as t2
WHERE LEFT(t1.rufnummer,length(t2.vorwahl))=t2.vorwahl

Das funktioniert alles so weit so gut, nun ist es leider so, daß die Vorwahlen verschiedene Länge haben können z.B.:

001 â?? USA
001808 â?? USA/Hawaii

bei einer Rufnummer wie 0018081234 würde meine Abfrage also das folgende Resultat liefern:

0018081234 | USA
0018081234 | USA / Hawaii

wie kann ich die Abfrage ohne Verwendung von Subquerys (Subquerys werden bei meiner MySql â?? Version leider noch nicht unterstützt) so formulieren, daß sie nur das richtige Ergebnis liefert, also in diesem Fall:

0018081234 | USA / Hawaii.

Vielen Dank in Voraus für eure Hilfe
jack

olaf.dietsche
Posts: 401
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Schwierige SQL-Abfrage

Post by olaf.dietsche » 2003-05-24 20:44

jack88 wrote: Das funktioniert alles so weit so gut, nun ist es leider so, daß die Vorwahlen verschiedene Länge haben können z.B.:

001 â?? USA
Warum hast du diesen Eintrag überhaupt in deiner Datenbank? Wenn du ohnehin alle area codes in deiner Datenbank gespeichert hast, ist der doch überflüssig.

gamecrash
Posts: 339
Joined: 2002-05-27 10:52

Re: Schwierige SQL-Abfrage

Post by gamecrash » 2003-05-24 21:14

Hm, besonders gut normalisiert ist Deine Datenbank ja nicht ;)

Also, Denkanstöße die mir jetzt mal einfallen... mit

Code: Select all

ORDER BY length(t2.vorwahl)
müsste schonmal das folgende rauskommen:

0018081234 | USA / Hawaii
0018081234 | USA

(also das mit der längsten Vorwahl, was ja dann das richtige sein sollte, zuerst).

Dann könntest Du's mal mit nem GROUP BY auf die Telefonnummern-Spalte probieren...

Keine Ahnung ob des so funzt, is aber nen Versuch wert ;)

Outlaw
Posts: 1500
Joined: 2002-12-04 10:22
Location: 4. Server von rechts, 2. Reihe von oben

Re: Schwierige SQL-Abfrage

Post by Outlaw » 2003-05-24 21:21

Hmmmm, logisch ist es schon, da ja auch Hawaii eine USA Vorwahl hat, wird nicht einfach aber vielleicht komme ich dank meines gerade durchgeführten Biergenusses nicht auf die ultimative Lösung obwohl ich schon viel in SQL gemacht habe ....

Evtl. müsstest Du noch einen Check machen, ob das Ergebnis aus mehreren gleichen Werten besteht und dann das logischere wählen (also das längere) ....

Oder Du legts eine 3. Tabelle an:

1. Ländervorwahl
2. Staat (also Ortsvorwahl)
3. eigentliche Nummer

GameCrashs Lösung ist auch nicht schlecht, hier müsstest Du die Ergebnisliste nur auf 1 Ergebnis reduzieren aber das wäre dann eben hingetrickst ....
:D Gruß Outi :D

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Schwierige SQL-Abfrage

Post by alexander newald » 2003-05-24 22:19

Code: Select all

mysql> SELECT * FROM Tabelle1 as t1, Tabelle2 as t2
    ->   WHERE LEFT(t1.rufnummer,length(t2.vorwahl))=t2.vorwahl
    ->   ORDER BY LENGTH(t2.vorwahl) DESC
    ->   LIMIT 1;
Alexander Newald

jack88
Posts: 67
Joined: 2002-12-19 13:41

Re: Schwierige SQL-Abfrage

Post by jack88 » 2003-05-25 01:37

erst mal vielen Dank für eure mühe.

- olaf.dietsche
ich verstehe nicht so ganz was du meinst, es gibt in der db eine tabelle mit zwei spalten in der die areacodes stehen, in der einen spalte steht die vorwahl, die zweite spalte beinhaltet das land. was ist da überflüssig?

- GameCrash
was heiß nicht besonders gut normalisiert? die daten werden in die datenbank aus einer csv datei importiert auf die ich keinen einfluß habe. ich habe mir das gweiss nicht selber so ausgedacht. daß die vorwahl und die rufnummer in getrennte tabellen/spalten gehören, das ist mir ja auch klar, aber es ist halt so wie es ist :-) das mit der GROUP BY klausel müßte eigentlich funktionieren, aber steht GROUP BY nicht vor ORDER BY, ich meine das ergebnis wird zuerst gruppiert und erst dann sortiert und wenn das so ist, dann funktioniert es leider nicht :-(

- Outlaw
der Check müßte sich auf eine bereits selektierte ergebnismenge beziehen und dazu brauche ich eine subquery. natürlich könnte ich die ergebnismenge auch mit php weiter auwerten, aber ich wollte das ganze halt nach möglichkeit komplett mit SQL lösen.
das mit der dritten tabelle verstehe ich nicht so ganz?

- Alexander Newald
vielen dank für den tipp - allerdings soll das ergebnis nicht auf einen datensatz limitiert werden

gruß
jack

olaf.dietsche
Posts: 401
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Schwierige SQL-Abfrage

Post by olaf.dietsche » 2003-05-25 01:59

jack88 wrote:ich verstehe nicht so ganz was du meinst, es gibt in der db eine tabelle mit zwei spalten in der die areacodes stehen, in der einen spalte steht die vorwahl, die zweite spalte beinhaltet das land. was ist da überflüssig?
Nun, ich dachte, wenn du die Zeile mit 001 USA weglässt, dann ist dein Problem gelöst. Habe ich das falsch verstanden?

alexander newald
Posts: 1117
Joined: 2002-09-27 00:54
Location: Hannover

Re: Schwierige SQL-Abfrage

Post by alexander newald » 2003-05-25 13:34

Ah, das war nicht klar, dass mehr als ein Datensatz gesucht ist.

Die Frage stellt sich dann mir, kann denn die Nummer 0018081234 sicher den USA/Hawai zugeortnet werden oder kann es nicht auch eine Nummer aus den USA mit der Tel. Nummer 8081234 sein?

Alexander Newald