2016-06-10 18 views
1

Ich brauche Code entlang dieser Linie auszuführenWie Wert einer Variablen zuweisen Anweisung eine execute

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

jedoch mysql keine Variable erlaubt in Grenze überschritten werden, so dass ich zwei andere Dinge versucht

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

Dies ergibt einen Fehler, als

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

Hinweis tut, dass ich nicht @a vor überall erklärt haben, aber ich bin verloren in diesem Moment und weiß nicht weiter.

+0

Welche Version von MySQL verwenden Sie? – wchiquito

+0

es ist mariaDB 10.0.2 – avz2611

Antwort

1

Versuchen:

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

Eine weitere Option ohne CONCAT Funktion.

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

was ist der Zweck der ifnull-Anweisung? – avz2611

+0

übrigens Ihre Idee der Verwendung von '' 'gearbeitet, so habe ich die Antwort akzeptiert, aber können Sie erklären, warum Sie IFNULL – avz2611

+0

@ avz2611: [IFNULL] (https://mariadb.com/kb/en/mariadb/ifnull/) ist es, der Variablen '@ \' i \ '' einen Standardwert zuzuweisen, falls es NULL ist. – wchiquito

Verwandte Themen