MySQL,存储过程,如何从两个查询中获取结果,更新求解
我的程序是:这是一个计划MySQL,存储过程,如何从两个查询中获取结果,更新求解,mysql,stored-procedures,count,rowset,Mysql,Stored Procedures,Count,Rowset,我的程序是:这是一个计划 delimiter // CREATE PROCEDURE get_random_data() BEGIN Declare Count_a INT; SELECT Floor(Count(`id_x`) * Rand()) INTO Count_a From `x_data` Where `ok_w` = 1 And `active` = 2 And `time` >= Unix_timestamp(); # Now We s
delimiter //
CREATE PROCEDURE get_random_data()
BEGIN
Declare Count_a INT;
SELECT Floor(Count(`id_x`) * Rand()) INTO Count_a From `x_data` Where `ok_w` = 1 And `active` = 2 And `time` >= Unix_timestamp();
# Now We select Some Rows
SELECT `id_x` From `x_data` Where `spec` = 1 Limit Count_a,3;
# And if Count of this select is small than < 3
IF(row_count() < 3) then
SELECT `id_anonsu` From `x_data` Where `spec` = 0 Limit Count_a,2;
END IF ;
END//
delimiter ;
//目标
如何从两个查询中获得结果?
//一个来自if语句之前的查询
//从语句中的查询中选择第二个,若第一个查询计数小于3,则取决于您使用的客户端接口。例如,JDBC有statement.getMoreResults
有趣的是,查询同时包含delimeter//和//注释。好的,我找到了答案 原代码:
IF(row_count() < 3) then
SELECT `id_anonsu` From `x_data` Where `spec` = 0 Limit Count_a,2;
END IF ;
具有隐藏计数的版本
DROP PROCEDURE IF EXISTS test;
Delimiter //
CREATE PROCEDURE test(OUT w INT)
BEGIN
Declare Counter_a INT DEFAULT 0;
Set @id_counter = 0;
SELECT Floor(Count(`id_x`) * Rand()) INTO Counter_a From `x_data` Where `ok_w` = 1 And `active` = 2 And `time` >= Unix_timestamp();
SELECT `id_x` From `x_data` Where @id_counter := @id_counter + 1 And `spec` = 1 Limit Counter_a,3;
IF @id_counter < 3 THEN
Set Counter_a = Counter_a + 1;
SELECT `id_x` From `x_data` Limit Counter_a,2;
END IF;
Set w = @id_counter;
END //
Delimiter ;
@小费
它必须在所有条件之前在哪里
例如:
[.....] Where @id_counter := @id_counter + 1 And `field_2` > 1 LIMIT 0, 5;
将始终返回1
正确版本
[.....] Where `field_2` > 1 And [Other conditions] And @id_counter := @id_counter + 1 LIMIT 0, 5;
我真的不明白你的问题…你想从两个查询中得到结果吗?获取结果和行集是什么意思?是的,我想从这两个查询中获取结果。我使用mysql命令行,但在执行5x之后,我总是只得到一个结果。。
DROP PROCEDURE IF EXISTS test;
Delimiter //
CREATE PROCEDURE test(OUT w INT)
BEGIN
Declare Counter_a INT DEFAULT 0;
Set @id_counter = 0;
SELECT Floor(Count(`id_x`) * Rand()) INTO Counter_a From `x_data` Where `ok_w` = 1 And `active` = 2 And `time` >= Unix_timestamp();
SELECT `id_x` From `x_data` Where @id_counter := @id_counter + 1 And `spec` = 1 Limit Counter_a,3;
IF @id_counter < 3 THEN
Set Counter_a = Counter_a + 1;
SELECT `id_x` From `x_data` Limit Counter_a,2;
END IF;
Set w = @id_counter;
END //
Delimiter ;
mysql> Call test(@z); Select @z;
+-----------+
| id_x |
+-----------+
| 7 |
| 8 |
+-----------+
2 rows in set (0.00 sec)
+-----------+
| id_x |
+-----------+
| 8 |
+-----------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
+------+
| @z |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
@id_counter := @id_counter + 1
[.....] Where @id_counter := @id_counter + 1 And `field_2` > 1 LIMIT 0, 5;
[.....] Where `field_2` > 1 And [Other conditions] And @id_counter := @id_counter + 1 LIMIT 0, 5;