提供表格
id date job color qty
1 2018-12-10 12345 green 1
2 2018-12-11 12345
3 2018-12-15 12345
4 2018-12-21 12345 red
5 2018-12-21 12345 4
6 2018-12-22 12345
id
列是自动递增的,并且是表的主键。
简单查询
SELECT * FROM `table` WHERE `job` = '12345' ORDER BY `id` ASC;
将按插入顺序返回作业12345
的所有记录。
问题: 我将如何查询表以仅返回包含每一列的最新值的一行?
所需行如下所示
6 2018-12-22 12345 red 4
答案 0 :(得分:2)
一种方法是将Group_Concat()
与Substring_Index()
一起使用以提取最新的非空值。 GROUP_CONCAT()
会忽略null
的值。
SELECT
MAX(id) AS id,
MAX(date) AS date,
MAX(job) AS job,
SUBSTRING_INDEX(GROUP_CONCAT(color ORDER BY id DESC), ',', 1) AS color,
SUBSTRING_INDEX(GROUP_CONCAT(qty ORDER BY id DESC), ',', 1) AS qty
FROM `table`
WHERE `job` = '12345';
以上查询中的一个假设是date
的最大值对应于最大id
的值。
此外,由于我们仅关注“最新”值(仅获取一个值);我们将不受group_concat_max_len
变量的限制。
答案 1 :(得分:0)
您可以使用单独的子查询在每个单独的列中找到最大值:
SELECT
(SELECT MAX(id) FROM yourTable) AS id,
(SELECT MAX(date) FROM yourTable) AS date,
(SELECT MAX(job) FROM yourTable) AS job,
(SELECT MAX(color) FROM yourTable) AS color,
(SELECT MAX(qty) FROM yourTable) AS qty;
我不知道您为什么要这样做,这可能表明您的数据库设计/计划不佳。
答案 2 :(得分:0)
在查询中使用LIMIT作为
SELECT * FROM `table` WHERE `job` = '12345' ORDER BY `id` DESC LIMIT 1;
答案 3 :(得分:0)
您可以使用子查询来获得所需的结果:
select max(id) id,
job,
max(`date`) `date`,
(select qty from tbl
where qty is not null
and tbl.job = job
order by `date` desc
limit 1) qty,
(select color from tbl
where color is not null
and tbl.job = job
order by `date` desc
limit 1) color
from tbl
group by job