Как получить результат инструкции после инструкции EXECUTE в mySQL?

У меня есть таблица, и я читаю n% записей из нее. Для этого я подготовил запрос:

SET @rows := (SELECT COUNT(*)*0.5 FROM trending); PREPARE STMT FROM 'SELECT * FROM trending ORDER BY Count LIMIT ?'; EXECUTE STMT USING @rows; 

Выход, который я получаю:

 SET @rows := (SELECT COUNT(*)*0.5 FROM trending);# MySQL returned an empty result set (ie zero rows). PREPARE STMT FROM 'SELECT * FROM trending ORDER BY Count LIMIT ?';# MySQL returned an empty result set (ie zero rows). EXECUTE STMT USING @rows;# Rows: 8 

Как я могу получить записи из таблицы?

 SET @rows := (SELECT COUNT(*)*0.5 FROM trending); PREPARE STMT FROM 'SELECT * FROM trending order by somecolumn LIMIT ?'; EXECUTE STMT USING @rows; 

отлично работает в моей системе. нечетное количество строк дает вам округление

Редактировать:

 create table thing2 ( id int auto_increment primary key, theWhat varchar(40) not null, `count` int not null ); 

Вставьте 5 строк:

 insert thing2(theWhat,`count`) values ('anchovies',6),('tomato',1),('cat',99),('mouse',8),('spoon',70); SET @rows := (SELECT COUNT(*)*0.5 FROM thing2); PREPARE STMT FROM 'SELECT * FROM thing2 LIMIT ?'; EXECUTE STMT USING @rows; count might need to be in backticks (not on my system), if that is actually a column and you are doing the following : SET @rows := (SELECT COUNT(*)*0.5 FROM thing2); PREPARE STMT FROM 'SELECT * FROM thing2 order by `count` LIMIT ?'; EXECUTE STMT USING @rows; +----+-----------+-------+ | id | theWhat | count | +----+-----------+-------+ | 2 | tomato | 1 | | 1 | anchovies | 6 | | 4 | mouse | 8 | +----+-----------+-------+ SET @rows := (SELECT COUNT(*)*0.5 FROM thing2); PREPARE STMT FROM 'SELECT * FROM thing2 order by theWhat LIMIT ?'; EXECUTE STMT USING @rows; +----+-----------+-------+ | id | theWhat | count | +----+-----------+-------+ | 1 | anchovies | 6 | | 3 | cat | 99 | | 4 | mouse | 8 | +----+-----------+-------+ 

Версия 1 (показано на PHP)

Эта ревизия объясняется тем, что PHP упоминает об этом. Таким образом, это показывает множественный запрос, используя результирующий набор, заданный из определенной строки этого запроса. Показывает использование переменной @ которая явно сохраняет свое значение. И переменная heredoc $theSql устанавливается для самого самого множества запросов.

 <?php error_reporting(E_ALL); //mysqli_report(MYSQLI_REPORT_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); ini_set('display_errors', 1); try { $mysqli= new mysqli('localhost', 'dbusername', 'thePassword', 'theDbname'); // tweak accordingly if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); } echo "I am connected and feel happy.<br/>"; // Note the 3rd statment below (the EXECUTE) and the code below it that cares about output for the 3rd one only $theSql = <<<SQL SET @rows := (SELECT COUNT(*)*0.5 FROM thing2); PREPARE stmt123 FROM 'SELECT * FROM thing2 LIMIT ?'; EXECUTE stmt123 USING @rows; DEALLOCATE PREPARE stmt123; SQL; $shouldDebug=false; // change to true to see more debug info (such as the skipped multi-query results) $theCounter=0; $weCareAbout=3; // the 3rd line of the command: "EXECUTE stmt123 USING @rows; " if ($mysqli->multi_query($theSql)) { do { // Note this loop poached from http://php.net/manual/en/mysqli.multi-query.php if ($shouldDebug) echo "1a.<br/>"; $theCounter++; // store first result set if ($result = $mysqli->store_result()) { if ($shouldDebug) echo "1b.<br/>"; if ($theCounter==$weCareAbout) { while ($row = $result->fetch_row()) { echo $row[0]." ".$row[1]." ".$row[2]."<br>"; } } if ($shouldDebug) echo "1c.<br/>"; $result->free(); if ($shouldDebug) echo "1d.<br/>"; } // print divider if ($mysqli->more_results() && $shouldDebug) { printf("-----------------\n"); } if ($shouldDebug) "1e.<br/>"; } while ($mysqli->next_result() && $mysqli->more_results()); // above line to avoid error: Strict Standards: mysqli::next_result(): There is no next result set. ... // ...Please, call mysqli_more_results()/mysqli::more_results() to check whether to call ... // // the Manual page is not exactly clear on this. In fact, faulty. // http://php.net/manual/en/mysqli.multi-query.php } $mysqli->close(); // just showing it, what the heck } catch (mysqli_sql_exception $e) { throw $e; } ?> 

Выход из браузера:

 I am connected and feel happy. 1 anchovies 6 2 tomato 1 3 cat 99 

Длительное и короткое из этого выше do / while состоит в том, что мы находимся в этом цикле 4 раза на основе переданного запроса.

См. Страницу mysqli.multi-query mysqli.store-result и mysqli.store-result .