2016-06-10 120 views
1

我要沿着这条线执行代码值分配给一个变量如何使用执行语句

select @a := id from B limit @i ,1 

但是MySQL不允许一个变量在极限中传递,因此我尝试过其他两件事情

select @proc := concat('select @a := id from B limit ', @i, ',1'); 
prepare stmt from @proc; 
execute stmt; 

这给出了一个错误,一样

select @proc := concat(' id from B limit ', @i, ',1'); 
prepare stmt from @proc; 
select @a := execute stmt; 

请注意,我没有之前的任何地方申报@a,但我失去的此时并不知道如何继续。

+0

您使用的是哪个版本的MySQL? – wchiquito

+0

这是mariaDB 10.0.2 – avz2611

回答

1

尝试:

MariaDB [_]> SET @`a` := NULL, 
    ->   @`proc` := CONCAT('SELECT @`a` := `B`.`id` 
    '>        FROM `B` 
    '>        LIMIT ', IFNULL(@`i`, 0), ', 1 
    '>        '); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> PREPARE `stmt` FROM @`proc`; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

MariaDB [_]> EXECUTE `stmt`; 
+------------------+ 
| @`a` := `B`.`id` | 
+------------------+ 
|    10 | 
+------------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> SELECT @`a`; 
+------+ 
| @`a` | 
+------+ 
| 10 | 
+------+ 
1 row in set (0.00 sec) 

UPDATE

不使用CONCAT功能的另一种选择。

MariaDB [_]> SET @`a` := NULL, 
    ->   @`i` := IFNULL(@`i`, 0); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> PREPARE `stmt` FROM 'SELECT @`a` := `B`.`id` 
    '>       FROM `B` 
    '>       LIMIT ?, 1 
    '>       '; 
Query OK, 0 rows affected (0.00 sec) 
Statement prepared 

MariaDB [_]> EXECUTE `stmt` USING @`i`; 
+------------------+ 
| @`a` := `B`.`id` | 
+------------------+ 
|    10 | 
+------------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> DEALLOCATE PREPARE `stmt`; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> SELECT @`a`; 
+------+ 
| @`a` | 
+------+ 
| 10 | 
+------+ 
1 row in set (0.00 sec) 
+0

ifnull语句的目的是什么? – avz2611

+0

顺便说一句,你使用'''的想法工作,所以我接受了答案,但你能解释为什么你使用IFNULL – avz2611

+0

@ avz2611:[IFNULL](https://mariadb.com/kb/en/mariadb/ifnull/)如果它是NULL,则为变量'@ \'i''分配一个默认值。 – wchiquito