我遇到了SQL调用的问题。最后,我正在从搜索框运行AJAX调用并将结果返回到屏幕。我将结果限制为5,但如果结果总数超过5,则提供链接以查看其他所有地方。我想通过简单地在其中添加COUNT()
子句来处理问题,而COUNT()
确实正确地返回完整数量的匹配,它在循环时会终止我的while
语句并且仅返回第一个结果。当我删除count()
时,一切正常。
<?php
if(isset($_POST['word']) && $_POST['word'] != "")
{
$q=$_POST['word'];
try {
$db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("SELECT COUNT(ID) as counter, ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5");
$stmt->execute(array('%'.$q.'%', '%'.$q.'%'));
$foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();
$db->commit();
}
catch (PDOException $e)
{
echo "There was a system DB error. <br>".$e->getMessage();
}
if(isset($foundrows) && $foundrows == 0) {
echo "<div class='display_box' align='left'>
No matching results found</div>";
} else {
while($row = $stmt->fetch()) {
$counter = $row['counter'];
$id = $row['ID'];
$fname = $row['fname'];
$lname = $row['lname'];
?>
<a href="#" style="text-decoration:none; color:#000;">
<div class="display_box" align="left">
<?php echo $fname; ?> <?php echo $lname; ?><br/>
</div></a>
<?php
}
if(isset($counter) && $counter > 5) {
?>
<a href="#" style="text-decoration:none; color:#000;">
<div class="display_box" align="left">
<?php echo (5-$counter)." additional matches found."; ?>
</div></a>
<?php
}
}
}
?>
答案 0 :(得分:2)
COUNT()
是一个只返回一行的表上的聚合操作,这就是为什么在包含它时,你没有得到你想要的5个结果。
通过在查询中使用SUBSELECT
子句,您可以获得所需的一种方式:
SELECT (SELECT COUNT(ID) FROM tablename) as counter, ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5
这将返回您期望的5个结果,并将表中的行的完整计数作为每行中的一列。
答案 1 :(得分:1)
如果结果总数超过 5,提供查看所有其他地方的链接
要确定在没有LIMIT子句的情况下返回的行数,请使用SQL_CALC_FOUND_ROWS
SELECT SQL_CALC_FOUND_ROWS ID, fname, lname FROM tablename WHERE fname LIKE ? or lname LIKE ? ORDER BY ID LIMIT 5
然后,如果没有限制,您对SELECT FOUND_ROWS()
的呼叫将返回号码。注意:SELECT SQL_CALC_FOUND_ROWS
和SELECT FOUND_ROWS()
语句之间不应发生其他SQL调用,否则该值将不正确。
答案 2 :(得分:0)
这与PDO或PHP无关。如果指定聚合函数(如 COUNT(), MAX(),...),则需要对行进行分组,因为您不能计算单行(当然)。如果您未指定 GROUP BY ,则会折叠整个结果集。