SET @rows := (SELECT COUNT(*)*0.5 FROM trending);
PREPARE STMT FROM 'SELECT * FROM trending order by somecolumn LIMIT ?';
EXECUTE STMT USING @rows;
hoạt động tốt trên hệ thống của tôi. số hàng lẻ giúp bạn làm tròn số
Chỉnh sửa:
create table thing2
( id int auto_increment primary key,
theWhat varchar(40) not null,
`count` int not null
);
Chèn 5 hàng:
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 |
+----+-----------+-------+
Bản sửa đổi1 (hiển thị PHP)
Bản sửa đổi này là do op đề cập đến PHP. Vì vậy, điều này hiển thị một truy vấn nhiều, sử dụng tập kết quả được cung cấp từ một dòng cụ thể của truy vấn đó. Cho biết việc sử dụng @
biến rõ ràng vẫn giữ nguyên giá trị của nó. Và một heredoc
biến $theSql
được đặt cho chính nhiều truy vấn.
<?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;
}
?>
Đầu ra của trình duyệt:
I am connected and feel happy.
1 anchovies 6
2 tomato 1
3 cat 99
Điều dài và ngắn của do / while ở trên là chúng ta đang ở trong vòng lặp đó 4 lần dựa trên truy vấn được truyền.
Vui lòng xem Trang hướng dẫn mysqli.multi-query
và mysqli.store-result
.