mysql- 无法根据数据透视表的最新日期和时间获取数据 table
mysql- Unable to fetch data based on latest date and time from a pivot table
我有一个 table 存储应用程序详细信息。应用程序不过是一组显示分数的数据。
每个应用程序有 6 个部分,即 1、2、3、4、5 和 6。因此,在数据库中 table 部分可以具有从 1 到 6 的值。
同一个应用程序可以为一个部分保存一个或多个条目。例如,ID 为 9 的应用程序可以(可能)有 3 个条目用于第 1 部分。每个部分都有一个分数,分数只是一个数值。
我要获取的是:获取每个应用程序所有 6 个部分的分数,但只应显示最近的分数。因此,如果应用程序 9 第 1 部分在 01-06-2016 的得分为 8,而在 03-06-2016 的得分为 3,则应显示 3。
我的 table 看起来像这样:
CREATE TABLE IF NOT EXISTS `reg_updates` (
`id` int(11) NOT NULL,
`application_id` int(11) NOT NULL,
`part` int(11) NOT NULL,
`reg_score_id` int(11) NOT NULL,
`reg_score` int(11) NOT NULL,
`done_date` date NOT NULL,
`done_time` time NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1;
这是我为此目的编写的查询:
SELECT MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date,RU.application_id,
MAX(CASE WHEN (RU.part = 1 ) THEN RU.reg_score END) part1Score,
MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score,
MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score,
MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score,
MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score,
MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score
FROM reg_updates AS RU
GROUP BY RU.application_id;
但它没有获取正确的数据。我无法根据最新的 done_date 和 done_time 获取数据。我只是根据第一个条目得到它。
这是我遵循的 tutorial link 创建这种支点 table。
这是一个示例 SQL FIDDLE。
嗯,你应该首先通过 application_Id 和部分获取具有最新日期时间的所有数据,这将用作内部连接
SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,RU.part
FROM reg_updates
GROUP BY application_id, part;
然后在您的查询中使用它
SELECT
-- I'm not sure you want that line, do you ? It will only retrieve the latest date_time of ALL your parts for that application
MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date,
RU.application_id,
MAX(CASE WHEN (RU.part = 1 ) THEN RU.reg_score END) part1Score,
MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score,
MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score,
MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score,
MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score,
MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score
FROM reg_updates AS RU
--now you join on the previous
join (SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,part
FROM reg_updates
GROUP BY application_id, part) maxValues
on maxValues.part = RU.part and
maxValues.application_Id = RU.application_id and
maxValues.maxDate = CONCAT(RU.done_date,' ',RU.done_time)
GROUP BY RU.application_id;
顺便说一下,您只会得到所有部分的最新 date_time,但似乎这就是您想要的?
我有一个 table 存储应用程序详细信息。应用程序不过是一组显示分数的数据。
每个应用程序有 6 个部分,即 1、2、3、4、5 和 6。因此,在数据库中 table 部分可以具有从 1 到 6 的值。
同一个应用程序可以为一个部分保存一个或多个条目。例如,ID 为 9 的应用程序可以(可能)有 3 个条目用于第 1 部分。每个部分都有一个分数,分数只是一个数值。
我要获取的是:获取每个应用程序所有 6 个部分的分数,但只应显示最近的分数。因此,如果应用程序 9 第 1 部分在 01-06-2016 的得分为 8,而在 03-06-2016 的得分为 3,则应显示 3。
我的 table 看起来像这样:
CREATE TABLE IF NOT EXISTS `reg_updates` (
`id` int(11) NOT NULL,
`application_id` int(11) NOT NULL,
`part` int(11) NOT NULL,
`reg_score_id` int(11) NOT NULL,
`reg_score` int(11) NOT NULL,
`done_date` date NOT NULL,
`done_time` time NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1;
这是我为此目的编写的查询:
SELECT MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date,RU.application_id,
MAX(CASE WHEN (RU.part = 1 ) THEN RU.reg_score END) part1Score,
MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score,
MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score,
MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score,
MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score,
MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score
FROM reg_updates AS RU
GROUP BY RU.application_id;
但它没有获取正确的数据。我无法根据最新的 done_date 和 done_time 获取数据。我只是根据第一个条目得到它。
这是我遵循的 tutorial link 创建这种支点 table。
这是一个示例 SQL FIDDLE。
嗯,你应该首先通过 application_Id 和部分获取具有最新日期时间的所有数据,这将用作内部连接
SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,RU.part
FROM reg_updates
GROUP BY application_id, part;
然后在您的查询中使用它
SELECT
-- I'm not sure you want that line, do you ? It will only retrieve the latest date_time of ALL your parts for that application
MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date,
RU.application_id,
MAX(CASE WHEN (RU.part = 1 ) THEN RU.reg_score END) part1Score,
MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score,
MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score,
MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score,
MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score,
MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score
FROM reg_updates AS RU
--now you join on the previous
join (SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,part
FROM reg_updates
GROUP BY application_id, part) maxValues
on maxValues.part = RU.part and
maxValues.application_Id = RU.application_id and
maxValues.maxDate = CONCAT(RU.done_date,' ',RU.done_time)
GROUP BY RU.application_id;
顺便说一下,您只会得到所有部分的最新 date_time,但似乎这就是您想要的?