30/09/2018, 16:17

Query trong SQL sẽ nhận được giá trị trả về dạng gì?

Hi mọi người, mình không làm SQL nhiều nên đọc tới câu truy vấn này bị khó hiểu quá.

 sqlcounter max-total-dl-octets {
     counter-name = max-total-dl-octets
         check-name = Max-Input-Octets
         reply-name = ChilliSpot-Max-Input-Octets
         sqlmod-inst = sql
         key = User-Name
         reset = never
         query = "SELECT IFNULL(SUM(AcctInputOctets), 0) FROM radacct WHERE UserName='%{%k}'"
 }

Query này nó sẽ lưu được giá trị gì? Mình đoán nếu điều kiện nó thỏa, thì nó sẽ trả về true, ngược lại false. hoặc các giá trị tượng tự.

Câu query này dùng để kiểm tra xem người dùng có đạt tới ngưỡng download hay chưa.
Và đây không phải là SQL 100%, cái này là kết hợp giữa một script và SQL. Mình hi vọng có ai đó thể giúp mình đoán được kết quả trả về.

Bổ sung thêm đoạn code sử dụng sqlcounter: max-total-dl-octets

 max-total-dl-octets {
     reject = 1
 }
 if (reject) {
     update reply {
         Reply-Message := "You have reached your total download limit"
     }
     ok = reject
 }
Phạm Hoàng Tuấn viết 18:33 ngày 30/09/2018

“SELECT IFNULL(SUM(AcctInputOctets), 0) FROM radacct WHERE UserName=’%{%k}’”

E nghĩ là tính tổng các AcctInputOctets nếu không tồn tại thì set =0 trong bảng radacct where …
Kết quả sễ trả về 1 bảng n dòng, 1 cột mang giá trị Sum(AcctInputOctets ) nếu không có dòng nào thỏa điều kiện Where thì trả về 0

Lập Trình Sư viết 18:34 ngày 30/09/2018

Là một recordset, bao gồm 0, 1 hay nhiều row kết quả.
Query ở trên là một recordset, có một row, một column có giá trị là tổng của các cột AcctInputOctets của user trong format; nếu ko có user nào thì row sẽ bị NULL nên IFNULL() sẽ trả về 0 thay vì NULL.

Nguyễn Minh Dũng viết 18:21 ngày 30/09/2018

1 bảng 1 dòng, 1 cột mang giá trị Sum(AcctInputOctets )

Cụ thể là như thế nào Tuấn. Câu trả lời của em rất logic Anh đang nghiên cứu freeradius, nó sử dụng cái này để tính dung lượng download từ một user. Nhưng SQL + script của nó lạ quá.

nếu ko có user nào thì row sẽ bị NULL nên IFNULL() sẽ trả về 0 thay vì NULL.

Nếu trả về 0 thì có nghĩa là đã đạt đến ngưỡng hay chưa đến ngưỡng vậy anh? Ý em là đoán ấy, vì em không hiểu lắm về câu lệnh này nên hơi choáng.

P/S: Đã thêm đoạn script sử dụng max-total-dl-octets.
@tuancoi2506 và @laptrinhio có thể gợi ý một cái tên phù hợp cho topic này không?

Lập Trình Sư viết 18:22 ngày 30/09/2018

@ltd nếu không dùng IFNULL thì trường hợp mà ko có user nào tìm thấy đúng như trong format kia thì kết quả sẽ bị NULL ; mà query trả về NULL chắc là không hợp lý khi sử dụng, vì code mong muốn nhận một giá trị là số. Vậy sử dụng IFNULL để khi mà kết quả là NULL từ SELECT thì sẽ trả về 0. Chỉ là logic if-else bình thường thôi.

Phạm Hoàng Tuấn viết 18:31 ngày 30/09/2018

Nếu trả về 0 thì có nghĩa là đã đạt đến ngưỡng hay chưa đến ngưỡng vậy anh? Ý em là đoán ấy, vì em không hiểu lắm về câu lệnh này nên hơi choáng

e ngĩ có chỉ =0 trong 2 TH:
Th1: user đó chưa download lần nào
Th2" không tồn tại user thỏa điều kiện (chứa dấu {'trong này fai chứa chữ k'})

Nguyễn Minh Dũng viết 18:20 ngày 30/09/2018

Th1: user đó chưa download lần nào

Điều kiện này chắc không hợp lý đâu. Vì khi mới kết nối vào mạng là đã download ngay. nên điều kiện này không phù hợp.

Th2" không tồn tại user thỏa điều kiện (chứa dấu {‘trong này fai chứa chữ k’})

cái này cũng lạ nữa, vì username mà có chữ k thì lạ quá, Anh có thể tạo account với tên bất kỳ.


Select ra thử thì ra cái này.

mysql> select AcctInputOctets from radacct;
+-----------------+
| AcctInputOctets |
+-----------------+
|        44086067 |
|         1965362 |
|        32228501 |
|          472869 |

mysql> SELECT IFNULL(SUM(AcctInputOctets), 0) FROM radacct WHERE UserName='dat125';
+---------------------------------+
| IFNULL(SUM(AcctInputOctets), 0) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IFNULL(SUM(AcctInputOctets), 0) FROM radacct WHERE UserName='dat127';
+---------------------------------+
| IFNULL(SUM(AcctInputOctets), 0) |
+---------------------------------+
|                          556489 |
+---------------------------------+
1 row in set (0.00 sec)

Lời giải thích của mọi người đã làm rõ điều này.

P/S: Tên không cần có chữ k nhé, anh nghĩ đó là một cái biến, tên sẽ được truyền vào %k

Phạm Hoàng Tuấn viết 18:32 ngày 30/09/2018

cái này cũng lạ nữa, vì username mà có chữ k thì lạ quá, Anh có thể tạo account với tên bất kỳ

E nhìn ý nghĩa câu lệnh để đọc thôi a, còn e cũng k hiểu ý nó làm vậy làm chi

Nguyễn Minh Dũng viết 18:33 ngày 30/09/2018

Cảm ơn mọi người, câu trả lời của @laptrinhio và @tuancoi2506 đã phần nào giải đáp được thắc mắc của mình. Mình tiếp tục cày đây

Bài liên quan
0