从表1中获取记录,与表2中的多个记录进行比较

时间:2019-10-25 11:52:28

标签: mysql sql codeigniter join

我有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并且再次显示。

我希望这是有道理的,并且有人可以提供帮助。

2 个答案:

答案 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替换为参数

相关问题