webForumDet fria alternativet

top länder en besökre kommer ifrån.

Databaser & SQL

6 svar · 269 visningar · startad av SimonG

Medlem sedan maj 2000444 inlägg
Frågan#1

Hej,

Jag har en tabell som innehåller ipnummer och vilket land dom tillhör och får ut rätt land och landskod med;

SELECT cc AS Country_code, cn AS Country_name
FROM geo_cc
NATURAL JOIN geo_ip
WHERE inet_aton( "200.139.130.244" )
BETWEEN START AND END LIMIT 0 , 30

vilket ger:

Country_code  	 Country_name
BR 	            Brazil

hur skall en korrekt join se ut om jag vill ta ut landet från ytterligare en tabell som har ett fältnamn "server_ip" för att lista tex dom 30 länder som förekommer mest i server_ip? (top 30 länder som besöker en sida i mitt fall)

ipt lagras i xxx.xxx.xxx.xxx formatet.

geo_ip ser ut så här:

start        end          ci
33996344 	33996351 	1
50331648 	67277055 	2
67277056 	67277119 	3
67277120 	67283519 	2
67283520 	67283583 	3
.....

geo_c ser ut så här:

ci    cc     cn
1 	GB 	United Kingdom
2 	US 	United States
3 	CA 	Canada
4 	MX 	Mexico
5 	BM 	Bermuda
....

Databasen är mysql.

Simon

Medlem sedan dec. 200012 464 inlägg
#2
SELECT cn AS Country_name,count(*) as freq
FROM geo_cc
inner JOIN geo_ip on geo_cc.ci = geo_ip.ci
inner join annantabell
on inet_aton(server_ip) between start AND end
order by freq desc 
LIMIT 0 , 30
Medlem sedan maj 2000444 inlägg
#3

LarsG skrev:

SELECT cn AS Country_name,count(*) as freq
FROM geo_cc
inner JOIN geo_ip on geo_cc.ci = geo_ip.ci
inner join annantabell
on inet_aton(server_ip) between start AND end
order by freq desc 
LIMIT 0 , 30

Den kräver en group by och gruperar jag tex på tex country_name eller geo_cc.ci så tar den väääldigt lång tid. Jag dödade processen efter 40 sekunder.

Medlem sedan dec. 200012 464 inlägg
#4

Jo, jag glömde group by och den skall vara på country_name.

Vad säger explain? Har du index på start/end?

Medlem sedan maj 2000444 inlägg
#5

LarsG skrev:

Jo, jag glömde group by och den skall vara på country_name.

Vad säger explain? Har du index på start/end?

Explain säger:

id  	select_type  	 table  	type 	possible_keys  	 key 	key_len  	 ref  	                rows  	Extra
1 	SIMPLE 	         geo_cc 	ALL 	PRIMARY 	 NULL 	NULL 	         NULL 	                232 	Using temporary; Using filesort
1 	SIMPLE 	         geo_ip 	ref 	ci 	         ci 	1 	 	 usury_usury.geo_cc.ci 	315 	Using where
1 	SIMPLE 	         usury_hits 	ALL 	NULL 	         NULL 	NULL 	 	 NULL 	                4604 	Using where

Det var inga index, men satte dom nu men är osäker på hur jag bekfräftar att dom är satta.

Men via phpmyadmin får jag fram följande:

Indexes: Documentation
Keyname Type 	Cardinality 	Action 	Field
start 	INDEX 	73158  	Edit 	Drop 	start
end 	INDEX 	73158  	Edit 	Drop 	end
ci 	INDEX 	232  	Edit 	Drop 	ci

/simon

Medlem sedan maj 2000444 inlägg
#6

Ingenannan som sitter inne med svatet på varför det kan ta så passlång tid att exekvera frågan?

Simon

Medlem sedan maj 2000444 inlägg
#7

Har försökt hitta några andra lösningar utan resultat.

igen, ingen som kan tänkas ha någon lösning, all hjälp skulle uppskattas.

Simon

548 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
311 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
311 ms — ändringar (db)