Xに等しいかnullである変数で2つのテーブルを結合するJOINステートメントのJDatabase構文は何ですか?たとえば、複数の値で結合します。
通常のSQL でこれを実行できることを示すいくつかの例を見つけましたが、それがJDatabase構文にどのように変換されるのかわかりません。
私のクエリは現在、変数(a.animal)がb.idと等しい場合に機能しますが、変数(a.animal)が空の場合にも結合する必要があります。
$query1 = $db->getQuery(true)
->select ($db->quoteName(array('a.date','a.reminder','a.type','a.animal','a.mob')))
->select ($db->quoteName('b.nameandid') .'AS'. $db->quote('animalname'))
->from ($db->quoteName('app_reminders', 'a'))
->join('INNER', $db->quoteName('app_animal', 'b') . 'ON (' .$db->quoteName('a.animal'). 'LIKE' .$db->quoteName('b.id').')')
->where ($db->quoteName('a.date') . '>=' . 'NOW()', 'AND')
->where ($db->quoteName('a.user_id') . 'LIKE' . $db->quote($userid));
ON
ステートメントでは、AND
とOR
を組み合わせた複数の条件を追加できるはずです。したがって、このようなことでうまくいくはずです:
->join('INNER', $db->quoteName('app_animal', 'b') . 'ON (' .$db->quoteName('a.animal'). 'LIKE' .$db->quoteName('b.id').' OR ' . $db->quoteName('a.animal') . ' IS NULL)')
いくつかの懸念事項と改善点がありますが、最初にコードにスキップして、後で説明します。
次のように表示されるクエリを生成したいとします。
_SELECT a.date, a.reminder, a.type, a.animal, a.mob, b.nameandid AS 'animalname'
FROM app_reminders a
LEFT JOIN app_animal b ON a.animal = b.id
WHERE a.date >= NOW() AND a.user_id = 3
_
リンクされたStackOverflowページの質問のJOIN
とJOIN
が_LEFT JOIN
_を使用していることに注意してください。その質問のOPは、すべての結合されたテーブルの値を持つ行のみを必要としています。答えはJOIN
(通常の結合、別名_INNER JOIN
_)を使用します。これにより、結合値としてnull
を含む行が無視されます。
あなたは何か違うものが欲しい。 2番目のテーブルに行に結合する修飾値が含まれているかどうかに関係なく、最初のテーブルの行が必要です。これには、_LEFT JOIN
_が必要です。これが SQLFiddle Demo で、結合の結果を試して比較したい場合に使用します。 (これが目的のアクションでない場合は、このリンクを使用して、正しくないものを表現できるはずです。)_LEFT JOIN
_を使用すると、チェックするために追加の条件を追加する必要はありません_IS NULL
_。
として...
LIKE
演算子を使用していますが、_%
_または__
_ワイルドカードを使用していないため、LIKE
と記述する理由はありません。 _=
_に単純化します。date
とtype
はmysql [〜#〜] keywords [〜#〜] ですが、- 予約済みキーワード ではないため、そうではありませんバッククォートで囲む必要はありません。これは、他のすべての列とテーブル名にも当てはまります。これらすべてのエンティティでqn()
/quoteName()
を使用することはできますが、クエリの構文とコードに膨張を追加するだけです。'LIKE'
_は_' LIKE '
_より優れています)$userid
_変数をクエリに適用する場合は、整数_(int)
_としてキャストします。整数値は引用符で囲む必要はありません。select()
と1つのwhere()
呼び出しのみを使用します。 (複数のテーブルを結合する場合、複数のjoin()
呼び出しの存在は論理的/直感的です。)Joomla構文(引用メソッドは呼び出されません):
_$query = $db->getQuery(true)
->select("a.date, a.reminder, a.type, a.animal, a.mob, b.nameandid AS 'animalname'")
->from("app_reminders a")
->joinLeft("app_animal b ON a.animal = b.id")
->where("a.date >= NOW() AND a.user_id = " . (int)$userid);
_
pS実際にLIKE
をワイルドカード文字とともに使用したい場合は、 この投稿 が安全な方法を示します-Joomlaドキュメントからのソースです。