按列值分组结果并排序

Group results by column value and order by

我有这个 table(不是实际的,但它是一个例子):

ID| VAL |  LOG |     DATE
1    1     bla    xx/xx/xxxx
2    2     bla    xx/xx/xxxx
3    3     bla    xx/xx/xxxx
4    1     bla    xx/xx/xxxx
5    6     bla    xx/xx/xxxx
6    2     bla    xx/xx/xxxx

我需要一个查询来以更有条理的方式获取值。

这是我当前的查询:

SELECT *
FROM logs
WHERE date BETWEEN '$begin 00:00:00' and '$end 23:59:59'
ORDER BY id desc

这将 return 这样:

ID| VAL |  LOG |     DATE
6    2     bla    xx/xx/xxxx
5    6     bla    xx/xx/xxxx
4    1     bla    xx/xx/xxxx
3    3     bla    xx/xx/xxxx
2    2     bla    xx/xx/xxxx    
1    1     bla    xx/xx/xxxx

我想按 VAL 列组织它们,当然,按 id desc 排序。 所以它应该输出这个:

ID| VAL |  LOG |     DATE
5    6     bla    xx/xx/xxxx
3    3     bla    xx/xx/xxxx
6    2     bla    xx/xx/xxxx
2    2     bla    xx/xx/xxxx    
4    1     bla    xx/xx/xxxx
1    1     bla    xx/xx/xxxx

如您所见,VAL 列中的项目全部在一起。

我怎么能return这个?

我试过这个:

SELECT *
FROM logs
WHERE date BETWEEN '$begin 00:00:00' and '$end 23:59:59'
ORDER BY id desc
GROUP BY val

但是它 return 只为每个 VAL 项编辑了一行。

得到这个结果的正确方法是什么?

试试这个:

SELECT *
FROM logs
WHERE date BETWEEN '$begin 00:00:00' and '$end 23:59:59'
ORDER BY val desc, id desc

日期比较不需要时间部分。我会建议:

SELECT l.*
FROM logs l
WHERE date >= '$begin' and date < date_add('$end', interval 1 day)
ORDER BY val desc, id desc;

如果在$end的申请中加上1天,查询就更简单了:

SELECT l.*
FROM logs l
WHERE date >= '$begin' and date < '$end'
ORDER BY val desc, id desc;

你没有提到你在应用层使用的是什么。一般来说,在 SQL 语句中使用参数而不是用户定义的字符串更好。