Consulta para filtrar usuarios por "campos personalizados" de registro

Tengo un campo desplegable personalizado configurado en el registro donde los usuarios seleccionan una “Categoría” que mejor se adapte a ellos.

¿Cómo puedo encontrar usuarios en función de lo que seleccionaron en ese desplegable?

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
8 Me gusta

Intento encontrar la consulta correcta para poder buscar todos los usuarios que tienen un campo personalizado de usuario ‘Pro Email’, pero para encontrar los usuarios que no están en el grupo Pro.

He movido tu publicación a este tema. Creo que la última consulta en mi publicación anterior en este tema te acercará a lo que buscas. Si tu campo personalizado es de tipo confirmación, ingresa ‘true’ para el parámetro field_value. Esto devolverá todos los usuarios que han marcado la casilla de confirmación para el nombre de campo que proporciones en el parámetro field_name de la consulta.

La consulta deberá modificarse para que puedas filtrar los usuarios que ya están en tu grupo Pro.

2 Me gusta

¿Tienes algún ejemplo de una consulta para filtrar los usuarios que ya están en ese grupo y luego devolver solo los que no están en él?

No he usado mucho el plugin de explorador de datos para Discourse.

Aquí tienes una forma de hacerlo. Se agrega una tabla temporal llamada excluded_users que contiene a los miembros del grupo excluido. Deberás proporcionar el Nombre del grupo para el parámetro group_name de la consulta.

--[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)
3 Me gusta

Gracias por esa consulta del Explorador de datos, muy apreciada.

¿Qué tendría que definirse en field_value, ya que solo necesito procesar si tiene un valor establecido para el campo personalizado de usuario Pro Email?

Si Pro Email es un campo de confirmación (casilla de verificación), establecer el parámetro field_value de la consulta en true funcionará.

Dado que lo único que deseas hacer es verificar que el campo se haya establecido, creo que esta versión de la consulta funcionará mejor para ti. Elimina el parámetro field_value y verifica que el campo nombrado se haya establecido con (ucf.value = '') IS NOT TRUE. Esto devolverá false para cualquier usuario que no haya establecido el campo, y también devolverá false para los usuarios que hayan establecido el campo y luego hayan eliminado el valor que asignaron:

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

Si deseas que la consulta devuelva el valor del campo, cambia la sentencia SELECT final por:

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)
3 Me gusta

¡Gracias, funciona genial!

Hola @simon, ¿cuál de estas consultas funcionaría si tuviera varios campos personalizados y solo quisiera devolver una lista de usuarios y sus respuestas a esos campos personalizados? Tengo preguntas como “dónde te enteraste de nosotros”, que tiene casillas de verificación para permitir múltiples opciones, y otra que pregunta cómo les gustaría ser contactados por correo electrónico, SMS y correo postal.
Gracias
Clement

Ninguna de las consultas anteriores te dará exactamente lo que buscas. Sin escribir una nueva consulta, el mejor enfoque sería ejecutar la primera consulta que publiqué varias veces. Ejecútala una vez por cada uno de tus campos personalizados. Introduce el nombre del campo en la entrada field_name de la consulta. La consulta a la que me refiero es esta:

--[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)
1 me gusta