LEFT JOINと比較して、ユーザーとユーザーポイントのINNER JOINを使用すると、クエリのパフォーマンスが大幅に向上することがわかりました。
現在、新規ユーザーは登録時に0ユーザーポイントを持っていますが、ルールを使用して1ポイントに変更します。
0ポイントのすべてのユーザーに1ポイントを追加するために、ビューとビューの一括操作を使用することを考えていました。
「ポイント」に到達するには:userpointsテーブルにレコードがないため、ビューをフィルタリングして0ポイントのユーザーを表示することはできません。これは、ビューが生成しようとするSQLです。
SELECT ..
FROM
{users} users
LEFT JOIN {userpoints_total} userpoints_total ON users.uid = userpoints_total.uid
WHERE (userpoints_total.points = '0')
関連するテーブルにレコードがないユーザーを見つけるために、ビューを含むクエリを生成することはできないと思いますか?それともトリックはありますか?
私はそれを考え出した:
function MYMODULE_views_query_alter(&$view, $query) {
if($view->name = "nameofview") {
$query->where[1]['conditions'][] = array('field' => 'userpoints_total.points', 'operator' => 'IS NULL',);
}
}
トリックがあります。条件は… WHERE userpoints_total.points IS NULL
である必要があります。これは、userpoints_total
にまだ行がないすべてのユーザーに当てはまります。 Afaikでは、ビューインターフェイスを介してその条件を簡単に追加できます。
安全のために、WHERE userpoints_total.points=0 OR userpoints_total.points IS NULL
を使用することもできます。