我有2个表(用户和用法)
用户表
username usage
a 32
b 5
c 5
用法表
username usage_added
a 7
b 7
c 7
a 30
我想从USERS表中获得USAGE大于X的所有项目(在这种情况下,假设X为30),并且如果在USAGES TABLE中没有找到具有相同用户名的记录,或者是否为此USAGES TABLE中的用户名比X小(本例中为30)
因此,在这种情况下,它不应返回任何记录。我有一个codeigniter查询
$this->db->select('users.username');
$this->db->from('users');
$this->db->join('usages', 'usages.username = users.username','left');
$this->db->where("(usages.email is NULL OR (usages.usage_added<30 AND usages.username=users.username))", NULL, FALSE);
$this->db->where("users.usage>30", NULL, FALSE);
通过使用上面的查询,我仍然返回“用户名a”。 通常,它不应返回用户A,因为用户a已添加日期30。但似乎它与第一条记录(a = 7)比较,并说a <30并且再次显示。
我希望这是有道理的,并且有人可以提供帮助。
答案 0 :(得分:1)
书面的SQL Server语法,此查询将为您工作:
DECLARE @usage_limit int = 30;
SELECT A.username
FROM users as A
LEFT OUTER JOIN
(
SELECT username,
usage_added = sum(usage_added)
FROM usages
GROUP BY
username
) as B
ON A.username = B.username
WHERE A.usage > @usage_limit
AND (B.username is null OR B.usage_added < @usage_limit)
这不返回任何记录。 希望这会有所帮助!
答案 1 :(得分:0)
您似乎在描述这样的逻辑:
select u.*
from users u
where u.usage > 30 or
not exists (select 1
from usages us
where us.username = u.username and
us.usage > 30
);
如果参数变化,应将30
替换为参数。