webForumDet fria alternativet

Använda alias i WHERE

3 svar · 444 visningar · startad av ThACRoW

ThACRoWMedlem sedan dec. 2001314 inlägg
#1

Jag har en logger som samlar in alla besökares ip-adresser. Sedan har jag en databas med numeriska ip-adresser samt landskod. Mitt syfte är att kunna få reda på vilket land alla ip-adresser är ifrån.

Jag har provat att använda alias som man definierar med "AS" i WHERE, men det gick inget bra. Fick följande felmeddelande: "Unknown column 'numeric_ip' in 'where clause'"

SELECT INET_ATON(logger.ip) 
AS numeric_ip, logger.ip, countries.country_code
FROM logger, countries
WHERE countries.ip_from <= numeric_ip
and countries.ip_to >= numeric_ip
GROUP BY logger.ip

Jag provade att lägga in INET_ATON(logger.ip) efter WHILE, men det dröjde nästan 1 minut innan den var klar... då den ska kalkylera om ip-adresserna för varje fält...

Se här för mer info:
http://ip-to-country.directi.com/node/view/54

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det går inte att använda alias i where. Hur skulle det gå till?
Värdena i select-listan finns ju inte innan frågan är utförd.

Vad har du för index på tabellen?

ThACRoWMedlem sedan dec. 2001314 inlägg
#3

Okej. Jag ger dig mina tabeller och så hoppas jag på att du klurar ut det åt mig :)

[b]logger[/b]
timestamp	varchar(14)
ip		varchar(15)
page		varchar(50)

+----------------+-----------------+----------------+
| timestamp      | ip              | page           |
+----------------+-----------------+----------------+
| 20030719150243 | XXX.XXX.XXX.XXX | /about.php     |
| 20030719150048 | XXX.XXX.XXX.XXX | /guestbook.php |
| 20030719150048 | XXX.XXX.XXX.XXX | /guestbook.php |
| 20030719150009 | XXX.XXX.XXX.XXX | /guestbook.php |
| 20030719145924 | XXX.XXX.XXX.XXX | /about.php     |
| 20030719145755 | XXX.XXX.XXX.XXX | /members.php   |
| 20030719145641 | YYY.YYY.YYY.YYY | /members.php   |
| 20030719145635 | YYY.YYY.YYY.YYY | /members.php   |
| 20030719145611 | YYY.YYY.YYY.YYY | /members.php   |
| 20030719145549 | YYY.YYY.YYY.YYY | /members.php   |
+----------------+-----------------+----------------+
...

[b]countries[/b]
ip_from        double
ip_to          double
country_code   char(2)

+-----------+-----------+--------------+
| ip_from   | ip_to     | country_code |
+-----------+-----------+--------------+
|         0 |  16777215 | US           |
|  50331648 |  83886079 | US           |
| 100663296 | 385875967 | US           |
| 404226048 | 404750335 | US           |
| 404815872 | 404877311 | US           |
+-----------+-----------+--------------+
...

Fälten ip_from och ip_to i tabellen countries är ip-adresser i numerisk form. För att få reda på vilket land en given ip-adress är ifrån gör man följande:

SELECT country_code FROM countries WHERE ip_from <= INET_ATON('127.0.0.1') AND ip_to >= INET_ATON('127.0.0.1')

Hur ska jag nu formulera min sql-fråga så att jag får ett resultat innehållande ip och country_code för varje rad i tabellen logger?

ThACRoWMedlem sedan dec. 2001314 inlägg
#4

...eller så får jag helt enkelt spara numeriska värdet på ip-adressen i tabellen logger. Blir kanske enklast och snabbast på det viset.

254 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
128 ms — hämta statistik (db)
124 ms — hämta tråd, inlägg och bilagor (db)