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 |
+----+-----------+-------+
Revision1 (PHP दिखाया गया)
यह संशोधन PHP का उल्लेख करने वाले op के कारण है। तो यह उस क्वेरी की किसी विशेष पंक्ति से दिए गए परिणाम सेट का उपयोग करके एक बहु-क्वेरी दिखाता है। @
. का उपयोग दिखाता है चर जो स्पष्ट रूप से इसके मूल्य को बरकरार रखता है। और एक 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
उपरोक्त का लंबा और छोटा समय यह है कि हम पास की गई क्वेरी के आधार पर 4 बार उस लूप में हैं।
कृपया मैनुअल पेज देखें mysqli.multi-query
और mysqli.store-result
।