MySQL - 如何知道寄存器是否是用户的第一个

时间:2016-06-04 17:25:42

标签: mysql

我不知道如何解释这个...我有一个包含一些记录的表格,我需要知道该注册表是否是用户的第一个,并且只显示是否是第一个报告& #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用户开始回答活动但没有结束..在这种情况下,我们也没有向此用户发送欢迎套件..

1 个答案:

答案 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)