サインアップのカスタムフィールドでユーザーをフィルタリングするクエリ

サインアップ時に、ユーザーが自分に最も合った「カテゴリ」を選択できるカスタムドロップダウンフィールドを設定しています。

そのドロップダウンで選択された値に基づいてユーザーを検索するには、どうすればよいでしょうか?

To get all values for a named field, try this, with the name of your field entered into the field_name input:

--[params]
-- string :field_name

WITH ucf_name AS(
SELECT
CONCAT('user_field_', id) AS name
FROM user_fields
WHERE name = :field_name
)

SELECT
u.id AS user_id,
ucf.value
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)

To get the value of a user field for a specific user:

--[params]
-- string :field_name
-- string :username

WITH ucf_name AS(
SELECT
CONCAT('user_field_', id) AS name
FROM user_fields
WHERE name = :field_name
)

SELECT
u.id AS user_id,
ucf.value
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)
AND u.username = :username

To only get users who have entered a specific value for a field, try this, with the name of the field entered into the field_name input, and the value you are looking for entered into the field_value input:

--[params]
-- string :field_name
-- string :field_value

WITH ucf_name AS(
SELECT
CONCAT('user_field_', id) AS name
FROM user_fields
WHERE name = :field_name
)

SELECT
u.id AS user_id
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)
AND ucf.value = :field_value

カスタムユーザーフィールド「Pro Email」を持つすべてのユーザーを検索したいのですが、Pro グループには属していないユーザーを特定するには、どのようなクエリを使用すればよいでしょうか?

投稿をこのトピックへ移動しました。前の投稿の最後のクエリが、お探しのものに近づくと考えられます。カスタムフィールドが確認タイプの場合、field_value パラメータに ‘true’ を入力してください。これにより、クエリの field_name パラメータで指定したフィールド名の確認ボックスにチェックを入れたすべてのユーザーが返されます。

Pro グループに既に含まれているユーザーを除外できるよう、クエリを拡張する必要があります。

そのグループに既に含まれているユーザーを除外し、含まれていないユーザーのみを返すクエリの例はありますか?

Discourse のデータエクスプローラープラグインはあまり使ったことがありません。

以下にその方法の一例を示します。除外されたグループのメンバーで構成される excluded_users という一時テーブルを追加します。クエリの group_name パラメータには、対象グループの名前を指定する必要があります。

--[params]
-- string :field_name
-- string :field_value
-- string :group_name

WITH ucf_name AS(
SELECT
CONCAT('user_field_', id) AS name
FROM user_fields
WHERE name = :field_name
),
excluded_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :group_name
)

SELECT
u.id AS user_id
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)
AND ucf.value = :field_value
AND u.id NOT IN (SELECT user_id FROM excluded_users)

そのデータエクスプローラーのクエリをありがとうございます。大変参考になりました。

Pro メールユーザーのカスタムフィールドに値が設定されている場合のみ処理を行うには、field_value に何を定義すればよいでしょうか?

Pro Email が確認フィールド(チェックボックス)である場合、クエリの field_value パラメータを true に設定することで動作します。

フィールドが設定されているか確認するだけであれば、このクエリバージョンの方が適していると考えられます。field_value パラメータを削除し、指定されたフィールドが設定されているか (ucf.value = '') IS NOT TRUE でチェックします。これにより、フィールドが設定されていないユーザーに対しては false が返され、また一度設定してから値を削除したユーザーに対しても false が返されます。

--[params]
-- string :field_name
-- string :group_name

WITH ucf_name AS(
SELECT
CONCAT('user_field_', id) AS name
FROM user_fields
WHERE name = :field_name
),
excluded_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :group_name
)

SELECT
u.id AS user_id
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)
AND (ucf.value = '') IS NOT TRUE
AND u.id NOT IN (SELECT user_id FROM excluded_users)

クエリでフィールドの値を返したい場合は、最後の SELECT 文を以下のように変更してください。

SELECT
u.id AS user_id,
ucf.value
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)
AND (ucf.value = '') IS NOT TRUE
AND u.id NOT IN (SELECT user_id FROM excluded_users)

ありがとうございます!とてもよく機能しています!

こんにちは @simon さん、

複数のカスタムフィールドがあり、それらのカスタムフィールドに対するユーザーとその回答のリストのみを返したい場合、これらのクエリのどれが機能しますか?「どこで私たちを知りましたか」のような質問があり、複数の選択肢を許可するチェックボックスがあり、連絡方法(メール、SMS、郵便)を尋ねる別の質問もあります。

よろしくお願いします。
クレメント

上記のクエリのいずれも、あなたが探しているものを正確に提供しません。新しいクエリを作成せずに、最善のアプローチは、私が投稿した最初のクエリを複数回実行することです。カスタムフィールドごとに1回実行します。クエリのfield_name入力にフィールド名を入力します。私が参照しているクエリは次のとおりです。

--[params]
-- string :field_name

WITH ucf_name AS(
SELECT
CONCAT('user_field_', id) AS name
FROM user_fields
WHERE name = :field_name
)

SELECT
u.id AS user_id,
ucf.value
FROM users u
JOIN user_custom_fields ucf
ON ucf.user_id = u.id
WHERE ucf.name = (SELECT name FROM ucf_name)