我不知道如何解释这个...我有一个包含一些记录的表格,我需要知道该注册表是否是用户的第一个,并且只显示是否是第一个报告& #34;新用户"
我有一个用户表:(基本数据)
USERID - NAME - ADDRESS
------------------------
100 --- JOHN - XXXXXXXXX
200 --- MIKE - XXXXXXXXX
220 --- CARL - XXXXXXXXX
答案表(该表有更多数据 - 每项活动的答案 - 但对我们来说并不重要)
ANSWERSID --- ACTID ----- USERID ---- START DATE ---- END DATE
10 ------------ 103 ------- 100 ------- 2015-05-10 ---- 2015-05-11
11 ------------ 101 ------- 100 ------- 2015-05-13 ---- 2015-05-15
12 ------------ 102 --------200 ------- 2016-05-22 ---- 2016-05-24
13 ------------ 101 --------220 ------- 2016-05-30 ---- 2016-05-31
14 ------------ 109 --------200 ------- 2016-06-10 ---- 2016-06-11
15 ------------ 19 ---------220 ------- 2016-06-11 ---- 2016-06-12
我有另一个包含每个活动名称的表
ACTID ---- ACT NAME
19 ------- LESSON A
100 ------ TEST A
101 ------ TEST B
102 ------ TEST C
103 ------ TEST D
109 ------ TEST M
(此表不是最终结果的重要内容,只是为了理解数据)
我有一些"课程"和" TESTS"。
课程是1到99之间的ACTID
测试是ACTID> = 100
如果用户完成TEST并进行第一次测试,我将发送一个" WELCOME KIT"。
如果用户完成了一个课程 - 他什么也得不到......
然后,我将在ANSWER TABLE上进行搜索,以了解2016-05-20至今之间收到的新答案。 (结束时间)
我收到了这个:
ANSWERSID --- ACTID ----- USERID ---- START DATE ---- END DATE
12 ------------ 102 --------200 ------- 2016-05-22 ---- 2016-05-24
13 ------------ 101 --------220 ------- 2016-05-30 ---- 2016-05-31
14 ------------ 109 --------100 ------- 2016-06-10 ---- 2016-06-11
15 ------------ 19 ---------220 ------- 2016-06-11 ---- 2016-06-12
但我需要知道 - 有了这个 - 女巫是每个用户发送欢迎套件的第一个测试
正确的表是:
ANSWERSID --- ACTID ----- USERID ---- START DATE ---- END DATE
12 ------------ 102 --------200 ------- 2016-05-22 ---- 2016-05-24
13 ------------ 101 --------220 ------- 2016-05-30 ---- 2016-05-31
因为ID 14具有USER 100 - 并且用户100的FIRST TEST是ID 10.
且ID 15不是TEST - 是一个课程。
然后,当然,我需要左连接/内连接此结果与USERS TABLE接收用户数据 - 按结束日期排序
USERID ----- USERNAME ---- ADDRESS --- ACTID ---- START DATE ---- END DATE
200 --------- MIKE -------XXXXXXX ---102 ------- 2016-05-22 ---- 2016-05-24
220-----------CARL --------XXXXXX ---101 ------- 2016-05-30 ---- 2016-05-31
*重要* 一些END DATES是0000-00-00用户开始回答活动但没有结束..在这种情况下,我们也没有向此用户发送欢迎套件..
答案 0 :(得分:0)
使用相关子查询根据answerid获取用户的第一个测试,然后确定第一个测试是否属于日期范围。您尚未提供开始日期和结束日期的数据类型,因此我假设其日期。
/*
DROP TABLE USERS;
DROP TABLE ANSWERS;
CREATE TABLE USERS (USERID INT, NAME VARCHAR(10), ADDRESS VARCHAR(20));
TRUNCATE TABLE USERS;
INSERT INTO USERS VALUES
(100, 'JOHN', 'XXXXXXXXX'),
(200, 'MIKE', 'XXXXXXXXX'),
(220, 'CARL', 'XXXXXXXXX'),
(230, 'DEKE', 'XXXXXXXXX')
;
CREATE Table ANSWERS (ANSWERID INT,ACTID INT,USERID INT,START_DATE DATE,END_DATE DATE);
TRUNCATE TABLE ANSWERS;
INSERT INTO ANSWERS VALUES
(10, 103 ,100, '2015-05-10', '2015-05-11'),
(11, 101 ,100, '2015-05-13', '2015-05-15'),
(12, 102 ,200, '2016-05-22', '2016-05-24'),
(13, 101 ,220, '2016-05-30', '2016-05-31'),
(14, 109 ,200, '2016-06-10', '2016-06-11'),
(15, 19 , 220, '2016-06-11', '2016-06-12'),
(16, 101 ,100, '2016-06-13', '2016-06-13'),
(17, 100 ,230, '2016-06-13', '0000-00-00')
;
*/
select A1.*,U.NAME
from ANSWERS A1
JOIN USERS U ON U.USERID = A1.USERID
WHERE A1.ANSWERID = (
SELECT MIN(A2.ANSWERID) FROM ANSWERS A2 WHERE A2.ACTID >= 100
AND A2.USERID = U.USERID
)
AND A1.END_DATE IS NOT NULL
AND A1.END_DATE <> '0000-00-00'
AND A1.START_DATE >= CAST('2016-01-01' AS DATE)
AND A1.END_DATE <= CAST('2016-05-31' AS DATE)