Toon posts:

Lastige SQL query... pfff

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een SQL probleem :'(. De situatie is als volgt:

CREATE TABLE Bezoekers (
IPAddress INT,
Datestamp DATETIME )

CREATE TABLE IPRanges (
IPStart INT,
IPEnd INT,
COUNTRY CHAR(2) )

De tabel IPRanges bevat dus records voor elke ingevoerde IP-range en de bijbehorende landcode.
Ik wil nu een output verkrijgen waarbij ik op basis van de tabel Bezoekers het aantal records per land kan zien.
Er zit ook nog een addertje onder het gras: Elk IPAddress komt overeen met meerdere, meestal 2 of 3, IP ranges. Ik moet de landcode hebben van de kleinste IP range.

Om de juiste gegevens voor één IP range te vinden, gebruik ik deze query:

SELECT TOP 1 Country FROM IPRanges WHERE -113472173 BETWEEN IPStart AND IPEnd ORDER BY IPStart DESC, IPEnd

Wie kan mij helpen?????

Thnx anyway! :)

Robin

  • joepP
  • Registratie: Juni 1999
  • Niet online
Kan je de grootte van een IPrange niet gewoon bepalen door het verschil tussen IPstart en IPEnd te nemen?
code:
1
2
3
4
SELECT TOP 1 Country, IPEnd-IPStart 
  FROM IPRanges
  WHERE <IPADRES> BETWEEN IPStart AND IPEnd
  ORDER BY IPEnd-IPStart

Kweet niet zeker of je in MySQL mag ORDERen op een berekende kolom, ik denk het wel. Als het verschil tussen IPEnd en IPStart geen goede maat is voor de grootte van je IP-range kan je ook een extra kolom IPDiff opnemen die de grootte van je IP-range bevat.

Suc6! :)

  • Prutser_IA
  • Registratie: Januari 2000
  • Laatst online: 03-06-2021

Prutser_IA

<*{{{><

Op dinsdag 09 oktober 2001 11:57 schreef joepP het volgende:
Kan je de grootte van een IPrange niet gewoon bepalen door het verschil tussen IPstart en IPEnd te nemen?
code:
1
2
3
4
SELECT TOP 1 Country, IPEnd-IPStart 
  FROM IPRanges
  WHERE <IPADRES> BETWEEN IPStart AND IPEnd
  ORDER BY IPEnd-IPStart

Kweet niet zeker of je in MySQL mag ORDERen op een berekende kolom, ik denk het wel. Als het verschil tussen IPEnd en IPStart geen goede maat is voor de grootte van je IP-range kan je ook een extra kolom IPDiff opnemen die de grootte van je IP-range bevat.

Suc6! :)
Order met een berekende kolom kan wel, maar moet je het iest anders aanpakken
code:
1
2
3
4
Select TOP 1 country, (IPend-IPstart) as IPverschil
From ipranges
where <ipadres> BETWEEN IPstart AND IPend
Order by IPverschil

Of je moet natuurlijk gewoon "order by 2" doen, zodat hij op de 2de colom sorteerd

42


Verwijderd

Topicstarter
Ja dat had ik dus eerst gedaan, maar aangezien de IP adressen ook een negatieve waarden kunnen hebben gaat dat rekensommetje niet op.

IPEnd - IPStart = 15 - 5 = 10
IPEnd - IPStart = -15 - -5 = -10

Dan zou ik weer helemaal met een CASE statement moeten werken (Microsoft SQL) en dat wordt weer traaaaaag ;(

  • joepP
  • Registratie: Juni 1999
  • Niet online
Op dinsdag 09 oktober 2001 13:18 schreef vertig0 het volgende:
Ja dat had ik dus eerst gedaan, maar aangezien de IP adressen ook een negatieve waarden kunnen hebben gaat dat rekensommetje niet op.

IPEnd - IPStart = 15 - 5 = 10
IPEnd - IPStart = -15 - -5 = -10

Dan zou ik weer helemaal met een CASE statement moeten werken (Microsoft SQL) en dat wordt weer traaaaaag ;(
Voeg een kolom IPVerschil toe die het verschil tussen IPStart en IPEnd bevat. Dit hoef je maar 1x uit te rekenen bij het INSERTen van de data. Aangezien je non-typed wil werken zal het kleinste verschil (0 dus :P) in je DB als -2147483648 worden opgeslagen.

Dit scheelt ook weer tijd bij het selecteren van je records. Gebruik een trigger voor het automatisch zetten van IPverschil, dan is de integriteit van je data ook gegarandeerd.

Verwijderd

Topicstarter
Ok, maar daarmee is mijn probleem nog steeds niet opgelost. Hoe doe ik dan een JOIN en koppel daarmee het record met de kleinste range??
Dit maakt de bedoeling beetje duidelijk maar werkt helaas niet :(

SELECT IPAddress, Country, COUNT(*D AS Total FROM Bezoekers JOIN IPRanges ON Bezoekers.IPAddress BETWEEN IPRanges.IPStart AND IPRanges.IPEnd AND IPRanges.LengthOfRange = MIN(IPRanges.LengthOfRange)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 14-09 17:42

Gerco

Professional Newbie

lama, hier stond iets doms.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1