استعلام لتصفية المستخدمين حسب "الحقول المخصصة" للتسجيل

لقد قمت بإعداد حقل قائمة منسدلة مخصص عند التسجيل، حيث يختار المستخدمون ‘فئة’ تناسبهم بشكل أفضل.

كيف يمكنني العثور على المستخدمين بناءً على ما اختاروه في تلك القائمة المنسدلة؟

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

أحاول العثور على الاستعلام الصحيح للبحث عن جميع المستخدمين الذين لديهم حقل مخصص للبريد الإلكتروني المدفوع، ولكن للعثور على المستخدمين الذين لا ينتمون إلى مجموعة المدفوع؟

لقد قمت بنقل منشورك إلى هذا الموضوع. أعتقد أن الاستعلام الأخير في منشوري السابق في هذا الموضوع سيقترب منك مما تبحث عنه. إذا كان حقلك المخصص من نوع التأكيد، فأدخل ‘true’ لمعامل field_value. سيعيد ذلك جميع المستخدمين الذين قاموا بتحديد مربع التأكيد لحقل الاسم الذي توفره لمعامل 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، حيث أحتاج فقط إلى المعالجة إذا تم تعيين قيمة لحقل المستخدم المخصص “البريد الإلكتروني الاحترافي”؟

إذا كان حقل “بريد إلكتروني محترف” (Pro Email) حقلاً للتأكيد (مربع اختيار)، فسيكون تعيين معامل 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، أي من هذه الاستعلامات ستعمل إذا كان لدي العديد من الحقول المخصصة وأردت فقط إرجاع قائمة بالمستخدمين وإجاباتهم على تلك الحقول المخصصة؟ لدي أسئلة مثل “أين سمعت عنا” والتي تحتوي على مربعات اختيار للسماح بخيارات متعددة، وسؤال آخر يسأل عن كيفية الاتصال بهم عبر البريد الإلكتروني أو الرسائل القصيرة أو البريد.
شكراً
كليمنت

لن تعطيك أي من الاستعلامات المذكورة أعلاه ما تبحث عنه بالضبط. بدون كتابة استعلام جديد، سيكون أفضل نهج هو تشغيل الاستعلام الأول الذي نشرته عدة مرات. قم بتشغيله مرة واحدة لكل حقل من حقولك المخصصة. أدخل اسم الحقل في مدخل 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)