SQL内部查询

时间:2014-07-26 05:25:59

标签: mysql sql database

我有一张用户表。每个用户都有某种类型,但用户的类型可以改变,我需要记录每个学生的过去类型。

所以我有

user_table
----------------
user_id     user_first_name ...


type_table
---------------
type_id   type_desc     


type_change_table
----------------
change_id    user_id   type_id      date_of_change   date_of_input

希望上面的3个表格是可以理解的。因此,如果我想要更改用户类型,我将类型更改输入到type_change_table中,为输入日期加上时间戳(可能与用户更改其类型date_of_change的实际日期不同)。然后,我有一个完整的每个用户类型历史记录的日志,以及每次更改输入数据库的时间。

我的问题是尝试执行某个SQL查询。 在英语中,查询是:

  

使用date_of_input TODAY获取更改类型的所有用户,并在更改之前输入的类型为TYPE。

TYPE和TODAY是变量。 例如我想知道今天谁输入了类型更改以及更改的类型。

我真的不确定如何在SQL中处理这种查询,我认为至少需要一个内部查询,以ASC顺序选择用户的倒数第二种类型。

我应该如何进行此查询?

3 个答案:

答案 0 :(得分:0)

我假设type_change_table通知新type_id而不是旧date_of_input。如果是这样,您需要在所需的date_of_change(由SELECT A.change_id, A.date_of_change, A.date_of_input , A.USER_ID, D.user_first_name, B.type_id id_old_type, E.type_desc id_old_type_desc, A.type_id id_new_Type, F.type_desc id_new_type_desc FROM ( -- This subquery gets the last change type --> maximum date before actual change SELECT actual_type.type_id, actual_type.user_id, actual_type.change_id, actual_type.date_of_change, actual_type.date_of_input, max(old_type.date_of_change) last_change_before_today FROM type_change_table actual_type INNER JOIN type_change_table old_type ON actual_type.user_id = old_type.user_id WHERE DATE_FORMAT(actual_type.date_of_input, '%Y-%m-%d') = '2014-07-18' AND old_type.date_of_change < actual_type.date_of_change GROUP BY actual_type.user_id, actual_type.change_id ) A -- B gets the last user type INNER JOIN type_change_table B ON A.user_id = B.user_id AND A.last_change_before_today = B.date_of_change -- D gets the user data INNER JOIN user_table D ON A.user_id = D.user_id -- E gets the description of old_type INNER JOIN type_table E ON B.type_id = E.type_id -- F gets the descrioption of new type INNER JOIN type_Table F ON A.type_id = F.Type_id WHERE E.type_desc = 'Type 1' 找到)之前获取最大更改日期。我选择了一堆字段来获取有关更改的最大信息,但您可以选择您真正需要的内容。

选择将是:

{{1}}

您可以定义参数替换查询中的值

请查看SQL小提琴here

答案 1 :(得分:0)

通过在exists子查询中使用ORDER BY和LIMIT 1,可以找到“倒数第二个”记录。我认为你的意思是“倒数第二”,但是使用DESC命令。

不确定您希望使用哪个日期字段,我选择了date_of_change,根据需要进行更改。

   /*Get all the users who changed their type with date_of_input TODAY 
    and whose type before the change was TYPE.*/


SET @today := '2014-07-26 00:00:00';
SET @type  := 4;

SELECT
      tct.user_id
    , ut.user_first_name
    , tct.type_id
    , tt.type_desc
FROM type_change_table tct
      INNER JOIN user_table ut
                  ON tct.user_id = ut.user_id
      INNER JOIN type_table tt
                  ON tct.type_id = tt.type_id
WHERE tct.date_of_change = @today
      AND EXISTS (
            SELECT
                  NULL
            FROM type_change_table prev
            WHERE tct.user_id = prev.user_id
                  AND date_of_change < @today
                  AND prev.type_id = @type
        ORDER BY date_of_change DESC
        LIMIT 1
      );

请参阅this sqlfiddle

答案 2 :(得分:-2)

使用此

SELECT * FROM user_table WHERE user_id IN(
    SELECT  user_id 
    FROM type_change_table tct INNER JOIN
        type_table tt ON tct.type_ID = tt.type_id
    WHERE 
        date_of_change = 'PUT DATE HERE' AND 
        type_desc = 'PUT TYPE HERE'
)