Query per filtrare gli utenti in base ai "campi personalizzati" di registrazione

Ho configurato un campo a tendina personalizzato durante la registrazione, dove gli utenti selezionano una “Categoria” che meglio li rappresenta.

Come posso trovare gli utenti in base a quanto hanno selezionato in quella tendina?

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

Sto cercando la query corretta per poter cercare tutti gli utenti che hanno un campo utente personalizzato “Pro Email”, ma per trovare gli utenti che non sono nel gruppo Pro?

Ho spostato il tuo post in questo argomento. Penso che l’ultima query nel mio precedente messaggio in questo argomento ti porterà vicino a ciò che stai cercando. Se il tuo campo personalizzato è di tipo conferma, inserisci ‘true’ per il parametro field_value. Questo restituirà tutti gli utenti che hanno spuntato la casella di conferma per il nome del campo che fornisci come parametro field_name della query.

La query dovrà essere modificata in modo da poter filtrare gli utenti che sono già nel tuo gruppo Pro.

Hai un esempio di query su come filtrare gli utenti già presenti in quel gruppo e restituire solo gli utenti che non vi appartengono?

Non ho usato molto il plugin Data Explorer per Discourse.

Ecco un modo per farlo. Aggiunge una tabella temporanea excluded_users composta dai membri del gruppo escluso. Dovrai fornire il nome del gruppo per il parametro group_name della query.

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

Grazie per questa query di Data Explorer, molto apprezzata.

Cosa dovrebbe essere definito in field_value, dato che devo solo verificare se è impostato un valore per il campo personalizzato ‘Pro Email’ dell’utente?

Se Pro Email è un campo di conferma (casella di controllo), impostare il parametro field_value della query su true funzionerà.

Dato che il tuo obiettivo è semplicemente verificare che il campo sia stato impostato, penso che questa versione della query sia più adatta. Rimuove il parametro field_value e verifica che il campo denominato sia stato impostato con (ucf.value = '') IS NOT TRUE. Questo restituirà false per qualsiasi utente che non ha impostato il campo e restituirà anche false per gli utenti che hanno impostato il campo e poi eliminato il valore inserito:

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

Se desideri che la query restituisca il valore del campo, modifica l’istruzione SELECT finale in:

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)

Grazie, funziona benissimo!

Ciao @simon , quale di queste query funzionerebbe se avessi più campi personalizzati e volessi restituire solo un elenco di utenti e le loro risposte a tali campi personalizzati? Ho domande come “dove ci hai conosciuto” che ha caselle di controllo per consentire scelte multiple, e un’altra che chiede come vorrebbero essere contattati via e-mail, SMS e posta.
Grazie
Clement

Nessuna delle query sopra ti darà esattamente ciò che stai cercando. Senza scrivere una nuova query, l’approccio migliore sarebbe eseguire più volte la prima query che ho pubblicato. Eseguila una volta per ciascuno dei tuoi campi personalizzati. Inserisci il nome del campo nell’input field_name della query. La query a cui mi riferisco è questa:

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