Mysql Oracle SQL-使用计数查询编写联接

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'); 我希望能加入,

我目前正在记录去年登录数据库的用户数

这是我正在使用的示例模式:(复制如下)

我有两个疑问:

问题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');
我希望能加入,得到这样的结果:

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没有时间组件,但将检查它。谢谢您好,非常感谢您的回答和建议,我们将接受您的建议!您好,非常感谢您的回答和建议,我们将接受您的建议!