Необходимо добавить оператор Group By в PHP / SQL, сгенерированный из Codecharge - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь изменить некоторый код PHP, который был создан много лет назад в Codecharge, чтобы включить предложение Group By в оператор MYSQL.

Я проверил мой запрос MYSQL, и он отлично работает в phpmyadmin.Когда я добавляю его на страницу php, он возвращает ошибку, потому что предложения WHERE и ORDER кодируются в разных местах, а затем вызываются в строку запроса.Очевидно, что когда GROUP BY остается в SQL, он разрывается, потому что он вставляет его перед WHERE в цепочке $ this, поэтому мне нужно выяснить, куда можно вставить часть кода GROUP BY, чтобы он связывал все вместев правильном порядке и страница загружается как следует.Ниже приведены 3 раздела, которые объединяют SQL и предложения, и веб-страница загружается нормально.Я закомментировал версию 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, и я уверен, что он будет работать и на странице, если я смогу заставить Группировку работать должным образом.Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Хорошо, вот что я сделал. Я удалил часть $ this-> Where из строки CCBuildSQL и поместил 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);
}
0 голосов
/ 15 мая 2019

Похоже, что вы не находитесь в IDE и напрямую изменяете сгенерированный код. Зайдите в IDE CodeCharge, выберите элемент управления, который вы хотите изменить, затем создайте событие пользовательского кода и поместите туда свой настроенный SQL.

http://docs.codecharge.com/studio50/html/index.html?http://docs.codecharge.com/studio50/html/ProgrammingTechniques/HowTo/CustomizingDataSource/ModifyOrderBy.html?toc

...