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
Essayer de trouver la requête correcte pour rechercher tous les utilisateurs ayant un champ utilisateur personnalisé « Pro Email », mais qui ne font pas partie du groupe Pro ?
J’ai déplacé votre publication dans ce sujet. Je pense que la dernière requête de ma précédente publication dans ce sujet vous rapprochera de ce que vous recherchez. Si votre champ personnalisé est de type confirmation, saisissez « true » pour le paramètre field_value. Cela retournera tous les utilisateurs qui ont coché la case de confirmation pour le nom de champ que vous fournissez dans le paramètre field_name de la requête.
La requête devra être complétée afin que vous puissiez filtrer les utilisateurs qui font déjà partie de votre groupe Pro.
Voici une méthode pour y parvenir. Elle ajoute une table temporaire excluded_users composée des membres du groupe exclu. Vous devrez fournir le nom du groupe pour le paramètre group_name de la requête.
--[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)
Si Pro Email est un champ de confirmation (case à cocher), alors définir le paramètre field_value de la requête sur true fonctionnera.
Puisque tout ce que vous souhaitez faire est de vérifier que le champ a été défini, je pense que cette version de la requête fonctionnera mieux pour vous. Elle supprime le paramètre field_value et vérifie que le champ nommé a été défini avec (ucf.value = '') IS NOT TRUE. Cela renverra false pour tous les utilisateurs qui n’ont pas défini le champ, et renverra également false pour les utilisateurs qui ont défini le champ puis supprimé la valeur qu’ils avaient saisie :
--[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 vous souhaitez que la requête renvoie la valeur du champ, modifiez l’instruction SELECT finale comme suit :
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)
Salut @simon , laquelle de ces requêtes fonctionnerait si j’avais plusieurs champs personnalisés et que je voulais juste retourner une liste d’utilisateurs et leurs réponses à ces champs personnalisés ? J’ai des questions comme « où avez-vous entendu parler de nous » qui a des cases à cocher pour permettre plusieurs choix, et une autre qui demande comment ils aimeraient être contactés par e-mail, SMS et courrier.
Merci
Clement
Aucune des requêtes ci-dessus ne vous donnera exactement ce que vous recherchez. Sans écrire une nouvelle requête, la meilleure approche serait d’exécuter la première requête que j’ai publiée plusieurs fois. Exécutez-la une fois pour chacun de vos champs personnalisés. Entrez le nom du champ dans l’entrée field_name de la requête. La requête à laquelle je fais référence est la suivante :
--[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)