按注册“自定义字段”筛选用户的查询

如果“专业邮箱”是一个确认字段(复选框),则将查询的 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)