获得 "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
1
和 2
进行比较。 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 循环要慢得多。
我有一个 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
1
和 2
进行比较。 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 循环要慢得多。