サインアップ時に、ユーザーが自分に最も合った「カテゴリ」を選択できるカスタムドロップダウンフィールドを設定しています。
そのドロップダウンで選択された値に基づいてユーザーを検索するには、どうすればよいでしょうか?
サインアップ時に、ユーザーが自分に最も合った「カテゴリ」を選択できるカスタムドロップダウンフィールドを設定しています。
そのドロップダウンで選択された値に基づいてユーザーを検索するには、どうすればよいでしょうか?
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)