【问题标题】:SQL SELECT COUNT rawQuery with PHP-MySQLi-Database-ClassSQL SELECT COUNT rawQuery 与 PHP-MySQLi-Database-Class
【发布时间】:2015-03-10 19:32:06
【问题描述】:

我从这里使用 mysqli 类:https://github.com/joshcam/PHP-MySQLi-Database-Class

...这个原始查询有问题:

    $q = mysql_query("SELECT id, value, (
                              SELECT COUNT( * ) 
                              FROM ".$dbprefix."pages
                              WHERE roles = ".$dbprefix."roles.id
                             )count
                             FROM '".$dbprefix."roles' ORDER by id ASC");
    $result = $db->rawQuery ($q);

它不起作用,我在 MysqliDb.php 的第 776 行准备查询时遇到致命错误 - mysql 查询本身有效,但是当我将它与 mysqli 类一起使用时它不起作用。我相信这与 COUNT (*) 或条纹标签或...有关。我已经尝试了几件事,但我卡住了。也许我不是唯一有这个问题的人——也许有人可以帮忙?这会很棒!感谢您的建议!

【问题讨论】:

  • 您遇到了什么错误?
  • 你确定它有效吗? ist 应该是“SELECT id, value, ( [...] ) AS count [....]” 不应该吗?而且您至少应该将 count 放入反引号中,因为它是一个关键字。
  • 首先,你为什么在这里使用mysql_query()?我的猜测是$q 包含false 的值而不是您的查询表示为字符串(尝试var_dump($q) 看看您得到了什么。其次,您为什么要在SELECT 语句中尝试子选择?您是否考虑过JOIN ?

标签: php mysql mysqli


【解决方案1】:

由于您使用的是 PHP-MySQLi-Database-Class,因此无需手动处理表前缀 - 只需使用 $db->setPrefix(...) 设置即可。

然后,当您选择的库直接执行此操作时,请不要执行 mysql_query(...)(无论如何都已弃用!)。 rawQuery() 正在寻找带有 SQL 查询的字符串,而不是 mysql_query() 返回的语句。

最后,尽可能避免子查询并用各种类型的JOIN 替换 - 更好的性能和更好的可读性。一般来说,人们会过度使用子查询——当你受到子查询的诱惑时,就会养成尝试找出JOIN 解决方案的习惯。有时您必须使用子查询,但大多数时候不是...

$db->setPrefix ($dbprefix);

$sql = "SELECT id, value, COUNT(pages.roles) AS c
        FROM roles
        LEFT JOIN pages ON pages.roles = roles.id
        ORDER by id ASC"
$result = $db->rawQuery($sql);

【讨论】:

  • 请向 OP(和未来的 SO 访问者)解释您为什么这样做以及它如何解决问题。
  • 更好,@JayBlanchard? :-)
  • 好多了@PeterBowers :-)
猜你喜欢
  • 2015-02-18
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多