Ich habe ein benutzerdefiniertes Dropdown-Feld für die Registrierung eingerichtet, bei dem Benutzer eine „Kategorie" auswählen, die am besten zu ihnen passt.
Wie kann ich Benutzer basierend auf ihrer Auswahl in diesem Dropdown finden?
Ich habe ein benutzerdefiniertes Dropdown-Feld für die Registrierung eingerichtet, bei dem Benutzer eine „Kategorie" auswählen, die am besten zu ihnen passt.
Wie kann ich Benutzer basierend auf ihrer Auswahl in diesem Dropdown finden?
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
Ich versuche, die richtige Abfrage zu finden, um alle Benutzer zu suchen, die ein benutzerdefiniertes Benutzerfeld „Pro Email
Ich habe deinen Beitrag in dieses Thema verschoben. Ich glaube, die letzte Abfrage in meinem vorherigen Beitrag in diesem Thema wird dir nahe an das heranführen, wonach du suchst. Wenn dein benutzerdefiniertes Feld ein Bestätigungstyp ist, gib „true
Gibt es ein Beispiel für eine Abfrage, mit der man Benutzer herausfiltern kann, die bereits in dieser Gruppe sind, und nur Benutzer zurückgibt, die nicht in dieser Gruppe sind?
Ich habe das Data Explorer-Plugin für Discourse noch nicht so oft verwendet.
Hier ist eine Möglichkeit, dies zu tun. Dabei wird eine temporäre Tabelle excluded_users erstellt, die aus Mitgliedern der auszuschließenden Gruppe besteht. Sie müssen für den Parameter group_name der Abfrage den Namen der Gruppe angeben.
--[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)
Vielen Dank für diese Data Explorer-Abfrage, sehr geschätzt.
Was müsste in field_value definiert werden, da ich nur prüfen muss, ob für das benutzerdefinierte Feld „Pro Email User
Wenn Pro Email ein Bestätigungsfeld (Checkbox) ist, funktioniert die Einstellung des Parameters field_value der Abfrage auf true.
Da Sie nur prüfen möchten, ob das Feld gesetzt wurde, denke ich, dass diese Version der Abfrage besser für Sie geeignet ist. Sie entfernt den Parameter field_value und prüft, ob das benannte Feld mit (ucf.value = '') IS NOT TRUE gesetzt wurde. Dies gibt false für alle Benutzer zurück, die das Feld nicht gesetzt haben, und ebenfalls false für Benutzer, die das Feld gesetzt und den Wert anschließend gelöscht haben:
--[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)
Wenn Sie möchten, dass die Abfrage den Wert des Feldes zurückgibt, ändern Sie die letzte SELECT-Anweisung wie folgt:
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)
Vielen Dank, es funktioniert großartig!
Hallo @simon , welche dieser Abfragen würde funktionieren, wenn ich mehrere benutzerdefinierte Felder hätte und nur eine Liste von Benutzern und ihren Antworten auf diese benutzerdefinierten Felder zurückgeben wollte? Ich habe Fragen wie „Woher haben Sie von uns erfahren?“, die Kontrollkästchen für Mehrfachauswahl zulassen, und eine andere, die fragt, wie sie kontaktiert werden möchten: E-Mail, SMS und Post.
Danke
Clement
Keine der obigen Abfragen liefert Ihnen genau das, wonach Sie suchen. Ohne eine neue Abfrage zu schreiben, wäre der beste Ansatz, die erste von mir gepostete Abfrage mehrmals auszuführen. Führen Sie sie einmal für jedes Ihrer benutzerdefinierten Felder aus. Geben Sie den Namen des Feldes in die Eingabe field_name der Abfrage ein. Die Abfrage, auf die ich mich beziehe, ist diese:
--[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)