我有一张用户表。每个用户都有某种类型,但用户的类型可以改变,我需要记录每个学生的过去类型。
所以我有
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顺序选择用户的倒数第二种类型。
我应该如何进行此查询?
答案 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
);
答案 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'
)