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
 }
1 Like

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

2 Likes

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.

3 Likes

Cụ thể là như thế nào Tuấn. Câu trả lời của em rất logic :+1: 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 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@laptrinhio có thể gợi ý một cái tên phù hợp cho topic này không?

1 Like

@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.

2 Likes

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'})

2 Likes

Đ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.

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

1 Like

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 :smile:

2 Likes

Cảm ơn mọi người, câu trả lời của @laptrinhio@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 :smile:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?