web-dev-qa-db-ja.com

関連するuserpointsテーブルに一致するレコードがないユーザーによるビューのフィルタリング

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') 

関連するテーブルにレコードがないユーザーを見つけるために、ビューを含むクエリを生成することはできないと思いますか?それともトリックはありますか?

1
uwe

私はそれを考え出した:

function MYMODULE_views_query_alter(&$view, $query) {
 if($view->name = "nameofview") {
     $query->where[1]['conditions'][] = array('field' => 'userpoints_total.points', 'operator' => 'IS NULL',);
    }
}
1
uwe

トリックがあります。条件は… WHERE userpoints_total.points IS NULLである必要があります。これは、userpoints_totalにまだ行がないすべてのユーザーに当てはまります。 Afaikでは、ビューインターフェイスを介してその条件を簡単に追加できます。

安全のために、WHERE userpoints_total.points=0 OR userpoints_total.points IS NULLを使用することもできます。

0
zwirbeltier