web-dev-qa-db-ja.com

Joomla JDatabaseのSQLを書き直す方法

カスタムJoomlaコーディングは初めてなので、すみません。次のステートメントを実行します。

"SELECT 
    MAX(CASE WHEN v.FieldName = 'Team_Name' THEN v.FieldValue END) 'Team_Name'
    , MAX(CASE WHEN v.FieldName = 'Manager_Name' THEN v.FieldValue END) 'Manager_Name'
FROM `team_values` v  
where tournamentId=5"

しかし、私はそれを書く方法がわかりません、多くのシナリオを試しましたが、それらは私のためにうまくいきませんでした。

1
Gibzy

Joomlaコードがクエリを実行するように求めていると思いますか?

もし、そうなら

$db = JFactory::getDBo();
$query = $db->getQuery(true);
$query->select("MAX(CASE WHEN v.FieldName=".$db->q('Team_Name')." THEN v.FieldValue END) as Team_Name, MAX(CASE WHEN v.FieldName = ".$db->q('Manager_Name')." THEN v.FieldValue END) as Manager_Name")->from('#__team_values as v')->where('v.tournamentId='.$db->q(5));
$db->setQuery($query);
$final_data = $db->loadObject();
1
Alagesan

初めての場合は、いくつかの基本的なエラーチェックと、生成されたクエリと2列の結果セットを印刷します。

テストされていないコード:

_$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select(
                    array(
                        "MAX(CASE WHEN v.FieldName = 'Team_Name'
                                  THEN v.FieldValue END) 'Team_Name'",
                        "MAX(CASE WHEN v.FieldName = 'Manager_Name'
                                  THEN v.FieldValue END) 'Manager_Name'"
                    )
                  )
                ->from("#__team_values v")
                ->where("v.tournamentId = 5");
    echo $query->dump();    // only if you  wish to see what is generated. Of course, don't do this on your live/public site
    $db->setQuery($query);
    echo "<pre>";
        var_export($db->loadAssocList());  // display the resultset
    echo "</pre>";
} catch (Exception $e) {
    echo "<div>", $e->getMessage(), "</div>";  // show error, if any.  Of course, don't do this on your live/public site
}
_

クエリは変数またはmysqlの予約済みキーワードを使用しないため、テーブル名、列、および値を引用するための$db->q()および$db->qn()呼び出しを省略して、コードの膨張を減らすことができます。整数5は一重引用符で囲む必要はありません。

_->_クエリメソッドをgetQueryからチェーンして、_$query_を再度書き出す必要がないようにします。

完全に引用符で囲まれたクエリで答えた同様の質問を表示するには、 この投稿を読む を使用します。

不安/不安があります...

これは、Joomlaのsqlメソッド呼び出しを使用したsqlの複製です。このクエリが意図したとおりに機能するかどうかは完全にはわかりません。テーブル構造/データのSQLFiddleデモを提供し、期待される結果を説明すると、クエリ自体を確認または修正できます。 loadRowList()loadAssocList()、およびloadObjectList()は複数行の結果セットを生成しますが、単一行のみが予期される場合は、loadRow()loadAssoc()、またはloadObject()の方が適しています。

FieldValueが数値でない場合、MAX()は奇妙な選択です。おそらく、これはクエリに最適ではありません。たぶん、あなたがMAX()を使用している理由について教えてください。 FieldValueの値が数値である場合、FieldNameの値を_[Word]_Name_と名付けるというあなたの決定について懸念があります-つまり、おそらく_[Word]_id_の方が適切でしょう。

1
mickmackusa