Schwierige SQL-Abfrage
-
- Posts: 67
- Joined: 2002-12-19 13:41
Schwierige SQL-Abfrage
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
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
-
- Posts: 401
- Joined: 2002-12-19 02:06
- Location: Siegburg
Re: Schwierige SQL-Abfrage
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.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
-
- Posts: 339
- Joined: 2002-05-27 10:52
Re: Schwierige SQL-Abfrage
Hm, besonders gut normalisiert ist Deine Datenbank ja nicht 
Also, Denkanstöße die mir jetzt mal einfallen... mit 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
Also, Denkanstöße die mir jetzt mal einfallen... mit
Code: Select all
ORDER BY length(t2.vorwahl)
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
-
- Posts: 1500
- Joined: 2002-12-04 10:22
- Location: 4. Server von rechts, 2. Reihe von oben
Re: Schwierige SQL-Abfrage
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 ....
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 ....
-
- Posts: 1117
- Joined: 2002-09-27 00:54
- Location: Hannover
Re: Schwierige SQL-Abfrage
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;
-
- Posts: 67
- Joined: 2002-12-19 13:41
Re: Schwierige SQL-Abfrage
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
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
- 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
-
- Posts: 401
- Joined: 2002-12-19 02:06
- Location: Siegburg
Re: Schwierige SQL-Abfrage
Nun, ich dachte, wenn du die Zeile mit 001 USA weglässt, dann ist dein Problem gelöst. Habe ich das falsch verstanden?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?
-
- Posts: 1117
- Joined: 2002-09-27 00:54
- Location: Hannover
Re: Schwierige SQL-Abfrage
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
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