SELECT (@row_number:=@row_number + 1) AS row_num不生效
时间: 2023-10-20 12:31:53 浏览: 48
关于您的问题,您提到的 SQL 查询中的 `@row_number` 变量似乎没有生效。有几个原因可能导致它不起作用:
1. 检查变量是否已经声明和初始化:在执行查询之前,需要先声明和初始化 `@row_number` 变量。请确保在查询之前包含以下语句:
```
SET @row_number = 0;
```
2. 确保语句中的变量使用正确:在查询中使用变量时,请确保在 `:=` 运算符两边没有额外的空格或其他字符。正确的语法是:`@row_number := @row_number + 1`。
3. 检查查询语句的上下文:有时在复杂的查询中,语句的顺序可能导致变量不按预期工作。请确保查询的上下文环境正确,并且没有其他地方修改了 `@row_number` 变量。
请检查以上几点,看看是否可以解决您的问题。如果问题仍然存在,请提供更多相关的代码和上下文,以便更好地帮助您解决问题。
相关问题
mysql中@row_num:=是什么意思
在MySQL中,`@row_num:=`是一种用户变量(user variable)的用法。用户变量是一种可以在查询中存储和检索值的技术。
`@row_num`是一个用户定义的变量名,您可以根据需要选择其他变量名。`:=`是用于将值分配给用户变量的赋值操作符。
举个例子,假设您有一个名为`orders`的表,其中包含订单信息,并且您想为每个订单添加一个递增的序列号。您可以使用用户变量来实现这个目标:
```sql
SELECT @row_num := @row_num + 1 AS serial_number, order_id, order_date
FROM orders, (SELECT @row_num := 0) AS r
ORDER BY order_date;
```
在上面的查询中,我们通过将用户变量`@row_num`初始化为0,并在每次查询行时递增它来为每个订单生成序列号。`serial_number`列将包含递增的值。
注意:用户变量在查询结束后会保留其值,因此可以在后续查询中使用。
SELECT caller_number, called_number FROM ( SELECT caller_number, called_number, call_start_time, IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt, @prev_called_number:=called_number FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR) AND caller_number NOT LIKE '0%' ORDER BY called_number, call_start_time ) AS t WHERE cnt >= 5
这是一个MySQL查询语句,它的作用是查询当前时间到前两小时的话单数据,然后统计同一个被叫号码总共被拨打的次数,如果超过5次,则认为异常,最后返回拨打号码和被叫号码。
具体的查询逻辑如下:
1. 查询话单表中,通话开始时间在当前时间到前两小时之间的记录。
```sql
WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
```
2. 排除掉拨打号码以0开头的记录。
```sql
AND caller_number NOT LIKE '0%'
```
3. 对查询结果按照被叫号码和通话开始时间进行排序,并使用MySQL的变量和IF函数,统计每个被叫号码被拨打的次数。
```sql
SELECT caller_number, called_number, call_start_time,
IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt,
@prev_called_number:=called_number
FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars
WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
AND caller_number NOT LIKE '0%'
ORDER BY called_number, call_start_time
```
4. 最后将统计结果作为子查询,筛选出被拨打次数超过5次的记录,并返回拨打号码和被叫号码。
```sql
SELECT caller_number, called_number
FROM (
SELECT caller_number, called_number, call_start_time,
IF(called_number=@prev_called_number, @cnt:=@cnt+1, @cnt:=1) AS cnt,
@prev_called_number:=called_number
FROM call_records, (SELECT @prev_called_number:=NULL, @cnt:=1) AS vars
WHERE call_start_time >= DATE_SUB(NOW(), INTERVAL 2 HOUR)
AND caller_number NOT LIKE '0%'
ORDER BY called_number, call_start_time
) AS t
WHERE cnt >= 5
```
注意:这个SQL查询语句只实现了被拨打次数超过5次的监控规则,还需要结合其他查询和处理,才能实现完整的异常监控。