Php explode() függvény megoldható-e sql scripttel
2015-01-21T21:47:47+01:00
2015-01-22T19:49:17+01:00
2022-07-19T08:25:17+02:00
eltaki
Sziasztok!
Annyi történik, hogy ip alapján a statiszttábla kiegészítődik egy település névvel.
A táblát update-lő programrészlet php-ban működik, csak piszok lassú. Óránként kb. 3000 sor, mivel 400e sort kell átírni ez egy hetes munka. A lehetőségekhez képest mindent kipróbáltam, átírtam mysqli-re, de csak 1%-os gyorsulás következett be. Az igazi az lenne ha phpMyadmin, vagy navicat-on futtatnám le közvetlenül. Pl. a GeoLiteCity-Blocks.csv (64 MB, több mint 2 millió sor) átírásakor először php-ban kezdtem el, de több mint egy nap lett volna. A navicat 16 perc alatt végzett.

Sql scriptbe történő átíráskor itt megakadtam.

 $iptomb = explode(".", $ip);
 $iptemp = (256*256*256*$iptomb[0]) + (256*256*$iptomb[1]) + (256*$iptomb[2]) + ($iptomb[3]);

Valahogy megoldható-e a mysql string fügvényeivel, hogy az ip címet (23.45.43.345) a pontok mentén szét daraboljuk és megkapjuk a szorzatot.
Ez az ipszorzat azért kell, hogy meg lehessen szerezni code-t ami egy másik táblában egy városnevet takar.

(`also`, `felso`, `code`)
(16777216, 16777471, 17),
(16777472, 16777727, 104084),

A nemleges válasz is érdekelne, előre is köszönettel:
eltaki
Mutasd a teljes hozzászólást!
esetleg: SUBSTRING_INDEX(str,delim,count)

Ott találsz egy ilyet is:
This will split an IP address ("a.b.c.d") into 4 respective octets:
SELECT `ip` , SUBSTRING_INDEX( `ip` , '.', 1 ) AS a, SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS b, SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS c, SUBSTRING_INDEX( `ip` , '.', -1 ) AS d FROM log_table

mysql 5.0-tól inet-aton()
Mutasd a teljes hozzászólást!

  • Köszi Micu! Sokat segítettél. A rövidebb megoldást ( INET_ATON(stats2014.remote_host) ) választottam, így az ip-k tökéletesen átalakulnak.

    SELECT time_str , INET_ATON(stats2014.remote_host) AS ip FROM stats2014;

    A következő résznek ez az ipszám szolgáltatná az alapját, de valami adatátadási probléma van.

    SELECT geocity.cc, geocity.city FROM geocity INNER JOIN geocityip ON geocityip.id= geocity.id WHERE geocityip.also<=ip && geocityip.felso>=ip IN (SELECT time_str , INET_ATON(stats2014.remote_host) AS ip FROM stats2014);

    A MySQL mondta:

    #1054 - Unknown column 'ip' in 'where clause' Hogyan lehetne kijavítani a hibát?
    Mutasd a teljes hozzászólást!
  • Unknown column 'ip' in 'where clause'
    Google fordítás:
    Ismeretlen oszlop "ip" a ", ahol záradék"

    Magyarul:
    Ismeretlen oszlop az ip. Biztos van ilyen nevű meződ?

    Nem ártana pl: geocityip.id vagy geocity.id, bár nem tudom a "geocityip" honnan jött?

    De az "in" feltételrész hogy tartozik egy összehasonlításhoz?

    geocityip.also<=ip && geocityip.felso>=ip ?????? IN (SELECT...

    De innen ez már egy új kérdés (mielőtt a moderátor mondja egy lezárással)
    Mutasd a teljes hozzászólást!
  • Tényleg, igazad van. Az eredeti kérdésre tökéletes választ adtál, így elfogadva. Még küszködök egy kicsit, ha végképp nem megy a folytatás,  akkor holnap új kérdést teszek fel.
    Mutasd a teljes hozzászólást!
abcd