Mysql Oracle SQL-使用计数查询编写联接
我目前正在记录去年登录数据库的用户数 这是我正在使用的示例模式:(复制如下) 我有两个疑问: 问题1:Mysql Oracle SQL-使用计数查询编写联接,mysql,sql,oracle,Mysql,Sql,Oracle,我目前正在记录去年登录数据库的用户数 这是我正在使用的示例模式:(复制如下) 我有两个疑问: 问题1: select distinct userid from tosuser tu; 问题2: select count (*) from tosevent te where te.LASTUPDATEDATE BETWEEN to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy'); 我希望能加入,
select distinct userid from tosuser tu;
问题2:
select count (*) from tosevent te where te.LASTUPDATEDATE BETWEEN
to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy');
我希望能加入,得到这样的结果:
USERNAME COUNT
FRED 7
MARY 2
其中count是指用户去年的登录次数。(我目前正在以java参数的形式传递年份)
我工作过的最接近的东西是:
select distinct username, LASTUPDATEDATE from tosuser tu, tosevent te where
te.LASTUPDATEDATE BETWEEN
to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy')
and te.username = tu.userid and tu.userenabled='1' and tu.userid!='OASIS';
这给了我每个登录事件。
我只是想知道您是否知道我将如何使用Oracle语法编写此查询
如果SQL FIDLE中的模式消失,请执行以下操作:
CREATE TABLE tosuser ( userid VARCHAR2(30) PRIMARY KEY, IsDeleted INT NOT NULL, UserEnabled INT,ExternalUser INT);
CREATE TABLE tosevent ( id VARCHAR2(30) PRIMARY KEY, username VARCHAR2(30), DATA3 VARCHAR2(30), LASTUPDATEDATE DATE );
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('OASIS',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('FRED',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('MARY',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('TOM',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('MICHEAL',1,1,1);
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (1,'FRED','successful logon',to_date('08/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (2,'FRED','successful logon',to_date('09/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (3,'FRED','successful logon',to_date('10/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (4,'FRED','successful logon',to_date('11/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (5,'FRED','successful logon',to_date('12/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (6,'MARY','successful logon',to_date('08/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (7,'MARY','successful logon',to_date('09/09/2014', 'dd/mm/yyyy'));
谢谢。我想你只需要一个
群组:
select username, count(*)
from tosuser tu join
tosevent te
on te.username = tu.userid
where te.LASTUPDATEDATE BETWEEN to_date('01/01/2014', 'dd/mm/yyyy') AND
to_date('31/12/2014', 'dd/mm/yyyy') and
tu.userenabled = '1' and tu.userid <> 'OASIS'
group by username;
您也可以通过查看年份来写这篇文章:
where extract(year from LASTUPDATEDATE) = 2014
但是,此版本可能不会像以前的版本那样有效地使用索引。我认为您只需要一个分组:
select username, count(*)
from tosuser tu join
tosevent te
on te.username = tu.userid
where te.LASTUPDATEDATE BETWEEN to_date('01/01/2014', 'dd/mm/yyyy') AND
to_date('31/12/2014', 'dd/mm/yyyy') and
tu.userenabled = '1' and tu.userid <> 'OASIS'
group by username;
您也可以通过查看年份来写这篇文章:
where extract(year from LASTUPDATEDATE) = 2014
但是,此版本的索引使用效果可能不如前一版本。您不能以这种方式使用DISTINCT
,因为它适用于SELECT
中的所有字段,而不仅仅适用于以下字段。
您应该使用分组依据
:
select username, LASTUPDATEDATE
from tosuser tu, tosevent te
where
te.LASTUPDATEDATE BETWEEN to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy')
and te.username = tu.userid
and tu.userenabled='1'
and tu.userid!='OASIS'
GROUP BY username
作为一个有点相关的评论,如果您看到以下内容:
select distinct(foo), bar ...
然后,您应该检查该查询,因为它可能没有执行它应该执行的操作。SELECT
的意思与
select distinct foo, bar ...
您不能以这种方式使用DISTINCT
,因为它适用于SELECT
中的所有字段,而不仅仅适用于以下字段。
您应该使用分组依据
:
select username, LASTUPDATEDATE
from tosuser tu, tosevent te
where
te.LASTUPDATEDATE BETWEEN to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy')
and te.username = tu.userid
and tu.userenabled='1'
and tu.userid!='OASIS'
GROUP BY username
作为一个有点相关的评论,如果您看到以下内容:
select distinct(foo), bar ...
然后,您应该检查该查询,因为它可能没有执行它应该执行的操作。SELECT
的意思与
select distinct foo, bar ...
您好,戈登,非常感谢您的回答,刚刚测试了您的查询,这正是我需要它做的,谢谢:)将考虑您的建议,我非常确定LASTUPDATEDATE没有时间组件,但将检查它。谢谢您好,戈登,非常感谢您的回答,刚刚测试了您的查询,这正是我需要它做的,谢谢:)将考虑您的建议,我非常确定LASTUPDATEDATE没有时间组件,但将检查它。谢谢您好,非常感谢您的回答和建议,我们将接受您的建议!您好,非常感谢您的回答和建议,我们将接受您的建议!