mysql - Oracle SQL - 编写带计数查询的连接

标签 mysql sql oracle

我目前正致力于在数据库中记录去年登录的用户数。

这是我正在使用的示例模式:http://sqlfiddle.com/#!4/7dfb6/15 (复制如下)

我有这两个问题:

查询 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 fiddle 的模式:

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'));

谢谢。

最佳答案

我想你只是想要一个group by:

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;

您需要小心使用日期。如果 LastUpdateDate 有一个时间部分,那么您要将其表达为:

where te.LASTUPDATEDATE >= date '2014-01-01' and te.LASTUPDATEDATE < date '2015-01-01'

你也可以只看年份来写:

where extract(year from LASTUPDATEDATE) = 2014

但是,这个版本使用索引的效率可能不如以前的版本。

关于mysql - Oracle SQL - 编写带计数查询的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745403/

相关文章:

php - 如何向 Yii CDbCriteria select 添加条件?

oracle - 根据一天中的时间进行选择

sql - 分层查询需要拉 child 、 parent 和 sibling

c - 无法使用 ODBC 连接到 Oracle 10g 快捷版

mysql - 如何在我的在线网站中启用 mysql 端口?

mysql - MAX() 是否可以提高查询性能?

php - 如何按其他表中的最新记录对记录进行排序

MySQL 查询不起作用

sql - 如何识别具有重复条目的列(使用 SQL)?

sql - 在特定条件下将一个表中的字段设置为另一个表中的字段