Een afstandstabel: hoe te bevragen?

Status
Niet open voor verdere reacties.

TomBishop

Nieuwe gebruiker
Lid geworden
4 mrt 2011
Berichten
2
Hallo allemaal,

Mijn SQL-probleem gaat over een afstandstabel. De tabel wordt zeer groot en beslaat enkele gigabytes. Ik heb de keuze om de tabel met een grote redundantie te bouwen, en dan komt bijvoorbeeld zowel de tuple "van A naar B" voor als "van B naar A". Dit komt de snelheid ten goede. Als ik echter (zeer veel) ruimte wil besparen, dan sla ik geen dubbele informatie op. Echter dan doet zich hetvolgende probleem voor:-

Beschouw de fictieve tabel “km_distances”:

To, From, km
--------------
A,B,1
A,C,2
A,D,3
A,E,4
A,F,5
G,A,2
H,A,3
I,A,4
J,A,5
C,A,2
B,K,3
C,X,8

Nu wil ik een overzicht van alle plaatsen binnen een straal van 4 km van 'A'. De vraag is nu: kan dit in 1 query zodat ik 1 resultaat set krijg? Ik zou namelijk het liefst willen voorkomen dat ik een tussenstap met een array in PHP moet gaan maken (gezien de grote omvang van de db).

Twee queries zou simpel zijn:
1. Select `From` from `km_distances` WHERE `To` = ‘A’ AND `km` <= 4;
2. Select `To` from `km_distances` WHERE `From` = ‘A’ AND `km` <= 4;

Dit levert op: 1 { B, C, D, E } en 2 { G, H, I, C }

Maar de vraag is dus, kan ik een enkel resultaat krijgen als: 3 { B, C, D, E, G, H, I }

Bij voorbaat dank. Overigens elk advies of ingeving m.b.t. de afstandenmatrix is welkom, dit lijkt me een vrij klassiek probleem.
 
Je kunt de twee queries combineren:

[sql]
Select `From`, `To` from `km_distances` WHERE ( `To` = 'A' OR `From` = 'A' ) AND `km` <= 4;
[/sql]

Je kunt met een IF statement zelfs alleen de andere opvragen als je wil:
[sql]
Select IF( `From`= 'A', `To`, `From` ) as Dest from `km_distances` WHERE ( `To` = 'A' OR `From` = 'A' ) AND `km` <= 4;
[/sql]

Overigens is het niet handig om `from` als veld te gebruiken gezien from een reserved keyword is, het is makkelijker om de namen anders te doen.

Hoop dat je er wat aan hebt :)
 
Hallo Frats,

De eerste oplossing lost nog niet het probleem op dat ik dan alsnog met PHP iets moet gaan verzinnen (om de "A-tjes" eruit weg te filteren), maar de tweede oplossing is precies wat ik zocht. Ik heb er nog een distinct() omheen geplaatst om de dubbelen eruit te gooien.

En je hebt helemaal gelijk dat `From` niet optimaal gekozen is als kolomnaam, maar zolang ik maar consistent ben met de `` gaat het goed :).

Bedankt voor je hulp.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan