我在注册页面设置了一个自定义下拉字段,用户可以在其中选择最适合他们的“类别”。
如何根据用户在该下拉菜单中的选择来查找用户?
我在注册页面设置了一个自定义下拉字段,用户可以在其中选择最适合他们的“类别”。
如何根据用户在该下拉菜单中的选择来查找用户?
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)
感谢您提供这个数据探索器查询,非常感谢。
既然我只需要处理“专业邮箱”用户自定义字段是否有值的情况,那么 field_value 中需要定义什么?
如果“专业邮箱”是一个确认字段(复选框),则将查询的 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 ,如果我有多个自定义字段,并且只想返回用户列表以及他们对这些自定义字段的回答,那么以下哪个查询会起作用?我有一些问题,例如“您从哪里得知我们”,其中包含允许多项选择的复选框,以及另一个询问他们希望如何联系(电子邮件、短信和邮寄)的问题。
谢谢
Clement
以上所有查询都不能完全满足您的需求。在不编写新查询的情况下,最好的方法是多次运行我发布的第一个查询。为每个自定义字段运行一次。将字段名称输入查询的 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)