php - 需要向 Codecharge 生成的 PHP/SQL 添加 Group By 语句

标签 php mysql codecharge

我正在尝试修改一些很久以前在 Codecharge 中创建的 PHP 代码,以在 MYSQL 语句中包含 Group By 子句。

我已经测试了我的 MYSQL 查询,它在 phpmyadmin 中运行得非常好。当我将它带入 php 页面时,它会返回一个错误,因为 WHERE 和 ORDER 子句是在不同的位置编码的,然后被调用到查询字符串中。显然,当 GROUP BY 留在 SQL 中时,它会中断,因为它将它插入到 $this 链中的 WHERE 之前,所以我需要找出可以在哪里插入代码的 GROUP BY 部分,以便将它们全部串在一起按照正确的顺序,页面将按其应有的方式加载。下面是将 SQL 和子句组合在一起的 3 个部分,并且网页加载良好。我按 SQL 版本注释掉了,因为如果没有 GROUP BY,它就无法正常工作。

//SetOrder Method @5-0FECF370
    function SetOrder($SorterName, $SorterDirection)
    {
        $this->Order = "book_name";
        $this->Order = CCGetOrder($this->Order, $SorterName, $SorterDirection, 
            "");
    }
//End SetOrder Method

//Prepare Method @5-C6449552
    function Prepare()
    {
        $this->wp = new clsSQLParameters($this->ErrorBlock);
        $this->wp->AddParameter("1", "urlshow_id", ccsInteger, "", "", $this->Parameters["urlshow_id"], "", false);
       $this->wp->Criterion[1] = $this->wp->Operation(opEqual, "ttb_books.show_id", $this->wp->GetDBValue("1"), $this->ToSQL($this->wp->GetDBValue("1"), ccsInteger),false);
        $this->Where = $this->wp->Criterion[1];

    }
//End Prepare Method

//Open Method @5-33D1EC54
    function Open()
    {
        $this->CCSEventResult = CCGetEvent($this->CCSEvents, "BeforeBuildSelect");
         $this->CountSQL = "SELECT COUNT(*)  " .
        "FROM (ttb_books INNER JOIN ttb_states ON " .
        "ttb_books.state_id = ttb_states.state_id) INNER JOIN ttb_statuses ON " .
        "ttb_books.status_id = ttb_statuses.status_id";
        $this->SQL = "SELECT *  " .
        "FROM (ttb_books INNER JOIN ttb_states ON " .
        "ttb_books.state_id = ttb_states.state_id) INNER JOIN ttb_statuses ON " .
        "ttb_books.status_id = ttb_statuses.status_id ";

        //$this->SQL = "SELECT ttb_books.book_id, ttb_books.book_name, ttb_books.show_id, ttb_states.state_name, COUNT(ttb_imgs.img_id) AS images " .
        //"FROM (ttb_books INNER JOIN ttb_states ON ttb_books.state_id = ttb_states.state_id) " .
        //"INNER JOIN ttb_statuses ON ttb_books.status_id = ttb_statuses.status_id " .
        //"LEFT JOIN ttb_imgs ON ttb_books.book_id = ttb_imgs.book_id ";
        $this->Group = "ttb_books.book_id, ttb_books.book_name, ttb_books.show_id, ttb_states.state_name";
        $this->CCSEventResult = CCGetEvent($this->CCSEvents, "BeforeExecuteSelect");
        $this->RecordsCount = CCGetDBValue(CCBuildSQL($this->CountSQL, $this->Where, ""), $this);
        $this->query(CCBuildSQL($this->SQL, $this->Where, $this->Order));
        $this->CCSEventResult = CCGetEvent($this->CCSEvents, "AfterExecuteSelect");
        $this->MoveToPage($this->AbsolutePage);
    }
//End Open Method

原始版本的代码只是列出了所有的书名,并按书名排序。我的版本还包括 COUNT,因为我不仅想查看所有书名,还想查看列表中每本书的页数。就像我说的,我的新 SQL 在 phpmyadmin 中运行良好,并且我确信如果我能让分组正常工作的话,它也会在页面上运行。感谢您的帮助!

最佳答案

好的,这就是我所做的。我删除了 CCBuildSQL 行的 $this->Where 部分,并将 WHERE 直接放入 sql 语句中,这使我可以使用 GROUP BY 并获得我正在寻找的结果。

    function Open()
{
    $this->CCSEventResult = CCGetEvent($this->CCSEvents, "BeforeBuildSelect");
     $this->CountSQL = "SELECT COUNT(*)  " .
    "FROM (ttb_books INNER JOIN ttb_states ON " .
    "ttb_books.state_id = ttb_states.state_id) INNER JOIN ttb_statuses ON " .
    "ttb_books.status_id = ttb_statuses.status_id";


    $this->SQL = "SELECT ttb_books.book_id, ttb_books.book_name, ttb_books.owned, ttb_books.show_id, ttb_shows.show_name, ttb_states.state_name, COUNT(img_id) AS images " .
    "FROM ttb_books " .
    "INNER JOIN ttb_states ON ttb_books.state_id = ttb_states.state_id " .
    "INNER JOIN ttb_statuses ON ttb_books.status_id = ttb_statuses.status_id " .
    "INNER JOIN ttb_shows ON ttb_books.show_id = ttb_shows.show_id " .
    "LEFT JOIN ttb_imgs ON ttb_books.book_id = ttb_imgs.book_id WHERE ttb_books.show_id=" . $this->Parameters["urlshow_id"] .
    " GROUP BY ttb_books.book_id, ttb_books.book_name, ttb_books.owned, ttb_books.show_id, ttb_shows.show_name, ttb_states.state_name " ;

    $this->CCSEventResult = CCGetEvent($this->CCSEvents, "BeforeExecuteSelect");
    $this->RecordsCount = CCGetDBValue(CCBuildSQL($this->CountSQL, $this->Where, ""), $this);
    $this->query(CCBuildSQL($this->SQL, "", $this->Order));
    $this->CCSEventResult = CCGetEvent($this->CCSEvents, "AfterExecuteSelect");
    $this->MoveToPage($this->AbsolutePage);
}

关于php - 需要向 Codecharge 生成的 PHP/SQL 添加 Group By 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56151720/

相关文章:

php - 如何在 mysql 查询的 'IN' 子句中使用 PHP 中的值数组?

asp.net - 我在哪里可以访问生产服务器上的 ASP.NET 配置?

php - MYSQL 表和列命名约定

php - 在两个日期之间搜索时,如果日期不存在则返回真值

javascript - PHP 包含在 jQuery next() 冲突中

php - Drupal:为我的表单创建一个特殊的模板文件会影响我的 css,它不会加载

php - 需要帮助使用 PHP 执行 .bat 文件