获得 "users without specific row "

Get "users without specific row "

我有一个 table 保存有关注册用户的信息。类似于此:

umeta_id | user_id | meta_key    | meta_value
---------|---------|-------------|-------------
 1       | 1       | nickname    | value
 2       | 1       | first_name  | value
 3       | 1       | custom_key  | value
 4       | 2       | nickname    | value
 5       | 2       | first_name  | value
 6       | 3       | nickname    | value
 7       | 3       | first_name  | value
 8       | 3       | custom_key  | value

注册有两种形式,因此注册用户对应的行数因注册时使用的表格而异。

例如,如果用户使用表单 A 进行注册,则有一行 custom_key 与该用户关联。如果用户使用表单 B,则没有 custom_key 行。将行与 user_id 12 进行比较。 1 使用表格 A 注册,2 使用表格 B 注册。

我可以获取 custom_key 的用户(使用表单 A),但是如何获取使用表单 B 的用户,即没有 custom_key 行的用户?

这个SELECT * FROM rfs_usermeta WHERE meta_key = 'custom_key'returnsrows/users用的是表格A,我需要做相反的事情

在 JS 中,我会这样写:

var users = {};

// loop usermeta rows
for (var row in rfs_usermeta) {
    // group rows with same user_id
    users[row.user_id][row.meta_key] = value;
}

var result = [];

// loop grouped rows
for (var user in users) {
    // assume users don't have custom_key row
    var rowExists = false;
    // loop user keys
    for (var key in user) {
        // check if custom_key exists 
        if (key == "custom_key") {
            // mark current user
            rowExists = true;
            break;
        }
    }
    // ignore marked users
    if (!rowExists) {
        result.push(user);
    }
}
SELECT * FROM rfs_usermeta r
HAVING (SELECT COUNT(*) FROM rfs_usermeta r2 where r2.user_id = r.user_id 
meta_key = 'custom_key') = 0 

SQL 在基于集合的方法中运行最好:假定为所有用户获取一组数据。以及具有自定义密钥的用户的一组数据。然后基本上减去两个:所有用户减去自定义密钥的用户=用户w/o自定义密钥。

相关子查询不存在。

只需获取一组具有自定义密钥的用户。然后是一组除具有自定义键的记录外的所有记录。

SELECT * 
FROM rfs_usermeta A
WHERE NOT EXISTS (SELECT * 
                  FROM rfs_usermeta B
                  WHERE A.umeta_id = B.umeta_id 
                    and B.meta_key = 'custom_key')

左连接也适用于类似的前提

SELECT * 
FROM rfs_usermeta A
LEFT JOIN rfs_usermeta B
 on A.umeta_id = B.umeta_id 
and B.meta_ket = 'custom_key'
WHERE B.user_ID is null
SELECT * 
FROM  rfs_usermeta 
WHERE user_id NOT IN( SELECT user_id FROM rfs_usermeta WHERE meta_key='custom_key')

如果您可以使用数据库进行过滤,那么您永远不想使用 PHP 进行过滤。您的数据库设计用于 gather/order/filter 数据,可以超级 快速执行此操作,而 PHP 循环要慢得多。