Zapytanie sql - tscript
Witam, uzywam sobie t-scripta do produkowania pliku dla radiusa. Obecnie wyglada to tak:
{result = SELECT LOWER(name) AS name, inet_ntoa(ipaddr) AS ip , passwd FROM nodes}\ {for (r=0; r<number(result); r++)}{if (result[r].passwd != "")}\ "{result[r].name}"{"\tCleartext-Password := "}"{result[r].passwd}" {"\t\tFramed-IP-Address = "}{result[r].ip} {/if}{/for}\
Siedze juz troszke, i nie moge poszukac, w jaki sposob wyliczana jest sumaryczna predkosc dla danego hosta. Uzywam tc-new(przypisywanie zobowiazan do hosta a nie klienta) Innymi slowy, jak wygenerowac to co powyzej ale z dodaniem kolejnego atrybutu dla radiusa zakladajac ze komputer klienta o nazwie 'host1' ma przypisane sumarycznie w LMS'ie taryfe 12/3 mbit/s ?
"host1" Cleartext-Password := "haslo1234",Framed-IP-Address = 1.1.1.1,Mikrotik-Rate-Limit = 12M/3M
Za pomoc dziekuje z gory. Pozdrawiam.
W dniu 20.06.2013 11:27, Łukasz Matys napisał(a):
Witam, uzywam sobie t-scripta do produkowania pliku dla radiusa. Obecnie wyglada to tak:
{result = SELECT LOWER(name) AS name, inet_ntoa(ipaddr) AS ip , passwd FROM nodes}\ {for (r=0; r<number(result); r++)}{if (result[r].passwd != "")}\ "{result[r].name}"{"\tCleartext-Password := "}"{result[r].passwd}" {"\t\tFramed-IP-Address = "}{result[r].ip} {/if}{/for}\
Siedze juz troszke, i nie moge poszukac, w jaki sposob wyliczana jest sumaryczna predkosc dla danego hosta. Uzywam tc-new(przypisywanie zobowiazan do hosta a nie klienta) Innymi slowy, jak wygenerowac to co powyzej ale z dodaniem kolejnego atrybutu dla radiusa zakladajac ze komputer klienta o nazwie 'host1' ma przypisane sumarycznie w LMS'ie taryfe 12/3 mbit/s ?
"host1" Cleartext-Password := "haslo1234",Framed-IP-Address = 1.1.1.1,Mikrotik-Rate-Limit = 12M/3M
Troszkę na marginesie: generujesz zwykłe pliki tekstowe czy bazę dbm?
Za pomoc dziekuje z gory. Pozdrawiam.
Wiadomość napisana przez Tomasz Chiliński w dniu 20 cze 2013, o godz. 12:06:
W dniu 20.06.2013 11:27, Łukasz Matys napisał(a):
Witam, uzywam sobie t-scripta do produkowania pliku dla radiusa. Obecnie wyglada to tak: {result = SELECT LOWER(name) AS name, inet_ntoa(ipaddr) AS ip , passwd FROM nodes}\ {for (r=0; r<number(result); r++)}{if (result[r].passwd != "")}\ "{result[r].name}"{"\tCleartext-Password := "}"{result[r].passwd}" {"\t\tFramed-IP-Address = "}{result[r].ip} {/if}{/for}\ Siedze juz troszke, i nie moge poszukac, w jaki sposob wyliczana jest sumaryczna predkosc dla danego hosta. Uzywam tc-new(przypisywanie zobowiazan do hosta a nie klienta) Innymi slowy, jak wygenerowac to co powyzej ale z dodaniem kolejnego atrybutu dla radiusa zakladajac ze komputer klienta o nazwie 'host1' ma przypisane sumarycznie w LMS'ie taryfe 12/3 mbit/s ? "host1" Cleartext-Password := "haslo1234",Framed-IP-Address = 1.1.1.1,Mikrotik-Rate-Limit = 12M/3M
Troszkę na marginesie: generujesz zwykłe pliki tekstowe czy bazę dbm?
Za pomoc dziekuje z gory. Pozdrawiam.
-- Pozdrawiam Tomasz Chiliński, Chilan
Ok, ogarnalem to tak:
mysql> select nodes.name,nodes.ipaddr,nodes.passwd,tariffs.upceil,tariffs.downceil from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id where nodes.name = 01; +------+------------+--------+--------+----------+ | name | ipaddr | passwd | upceil | downceil | +------+------------+--------+--------+----------+ | 01 | 3252324258 | | 1216 | 4288 | | 01 | 3252324258 | | 12288 | 12288 | | 01 | 3252324258 | | 0 | 0 | +------+------------+--------+--------+----------+ 3 rows in set (0.00 sec)
mysql>
Czyli mam wynik dla t-scripta, i zrobilem tak:
{result = SELECT LOWER(nodes.name) AS name, inet_ntoa(nodes.ipaddr) AS ip , nodes.passwd AS passwd, tariffs.downceil AS down, tariffs.upceil AS up from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id ;}\ {for (r=0; r<number(result); r++)}{if (result[r].passwd != "")}\ "{result[r].name}"{"\tCleartext-Password := "}"{result[r].passwd}" {"\t\tFramed-IP-Address = "}{result[r].ip}, {"\t\tMikrotik-Rate-Limit = "}{result[r].down"K"}/{result[r].up"K"} {/if}{/for}\
Problemy ktore zostaly do rozwiazania: - zmodyfikowac zapytanie tak by host zostal zwrocony tylko raz, oraz aby zapytanie zwrocilo zsumowane wartosci upceil i uprate (tylko dla aktywnych zobowiazan) - zapytanie ma zwrocic te hosty, ktorych wlasciciele maja status =3 (podlaczony), oraz maja aktywne zobowiazanie od teraz do day tx, lub od teraz w nieskonczonosc
Pomoze ktos? ;-).
Mam tu takie cos:
select customers.id,customers.name,customers.lastname,customers.email,assignments.customerid,tariffs.name,tariffs.value,assignments.dateto from assignments left join tariffs on assignments.tariffid = tariffs.id left join customers on assignments.customerid = customers.id where customers.status = 3 and (assignments.dateto > UNIX_TIMESTAMP( ) OR assignments.dateto = 0) ;
Trzebaby polaczyc z pierwszym zapytaniem, ale troche wymieka :/
P.S-generuje zwykly plik tekstowy. Pozdrawiam.
Ok, ogarnalem to tak:
mysql> select nodes.name,nodes.ipaddr,nodes.passwd,tariffs.upceil,tariffs.downceil from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id where nodes.name = 01; +------+------------+--------+--------+----------+ | name | ipaddr | passwd | upceil | downceil | +------+------------+--------+--------+----------+ | 01 | 3252324258 | | 1216 | 4288 | | 01 | 3252324258 | | 12288 | 12288 | | 01 | 3252324258 | | 0 | 0 | +------+------------+--------+--------+----------+ 3 rows in set (0.00 sec)
mysql>
Czyli mam wynik dla t-scripta, i zrobilem tak:
{result = SELECT LOWER(nodes.name) AS name, inet_ntoa(nodes.ipaddr) AS ip , nodes.passwd AS passwd, tariffs.downceil AS down, tariffs.upceil AS up from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id ;}\ {for (r=0; r<number(result); r++)}{if (result[r].passwd != "")}\ "{result[r].name}"{"\tCleartext-Password := "}"{result[r].passwd}" {"\t\tFramed-IP-Address = "}{result[r].ip}, {"\t\tMikrotik-Rate-Limit = "}{result[r].down"K"}/{result[r].up"K"} {/if}{/for}\
Wiec mam takie cos:
select nodes.name,nodes.ipaddr,nodes.passwd,tariffs.upceil,tariffs.downceil from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id left join customers on assignments.customerid = customers.id where customers.status = 3 and (assignments.datefrom <= UNIX_TIMESTAMP( ) OR assignments.datefrom = 0) AND (assignments.dateto > UNIX_TIMESTAMP( ) OR assignments.dateto = 0) and nodes.passwd != '' ;
Jedyny problem jaki zostal mi do rozwiazania to kwestia sytuacji, kiedy np host1 ma przypisane dwa aktywne zobowiazania, np: downceil 2 mbit i drugi downceil 5 mbit. Wowczas zostaje on zduplikowany w wyniku, a powinien wystapic jeden raz oraz miec zsumowane upceil i downceil ze zobowiazan ktore ma przypisane.
Jak powinno wygladac zapytanie: - powtarzajacy sie host wyswietl jeden raz, i zsumuj powtarzajace sie rekordy dla tego hosta z kolumny upceil i downceil.
Za pomoc dziekuje z gory. Pozdrawiam.
Wiec mam takie cos:
select nodes.name,nodes.ipaddr,nodes.passwd,tariffs.upceil,tariffs.downceil from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id left join customers on assignments.customerid = customers.id where customers.status = 3 and (assignments.datefrom <= UNIX_TIMESTAMP( ) OR assignments.datefrom = 0) AND (assignments.dateto > UNIX_TIMESTAMP( ) OR assignments.dateto = 0) and nodes.passwd != '' ;
Jedyny problem jaki zostal mi do rozwiazania to kwestia sytuacji, kiedy np host1 ma przypisane dwa aktywne zobowiazania, np: downceil 2 mbit i drugi downceil 5 mbit. Wowczas zostaje on zduplikowany w wyniku, a powinien wystapic jeden raz oraz miec zsumowane upceil i downceil ze zobowiazan ktore ma przypisane.
Jak powinno wygladac zapytanie:
- powtarzajacy sie host wyswietl jeden raz, i zsumuj powtarzajace sie rekordy dla tego hosta z kolumny upceil i downceil.
Za pomoc dziekuje z gory. Pozdrawiam.
-- Matys Łukasz
Temat rozwiazany, dla potomnych:
{result = SELECT LOWER(nodes.name) AS name, inet_ntoa(nodes.ipaddr) AS ip , nodes.passwd AS passwd, SUM(tariffs.downceil) AS downceil, SUM(tariffs.upceil) AS upceil from nodes left join nodeassignments on nodes.id = nodeassignments.nodeid left join assignments on nodeassignments.assignmentid = assignments.id left join tariffs on assignments.tariffid = tariffs.id left join customers on assignments.customerid = customers.id where customers.status = 3 and (assignments.datefrom <= UNIX_TIMESTAMP( ) OR assignments.datefrom = 0) and (assignments.dateto > UNIX_TIMESTAMP( ) OR assignments.dateto = 0) and nodes.passwd != '' group by nodes.name;}\ {for (r=0; r<number(result); r++)}{if (result[r].passwd != "")}\ "{result[r].name}"{"\t\tCleartext-Password := "}"{result[r].passwd}" {"\t\t\tFramed-IP-Address = "}{result[r].ip}, {"\t\t\tMikrotik-Rate-Limit = "}{result[r].downceil"k"}/{result[r].upceil"k"} {/if}{/for}\
Pozdrawiam.
uczestnicy (2)
-
Tomasz Chiliński
-
Łukasz Matys