按列值分组结果并排序
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 语句中使用参数而不是用户定义的字符串更好。
我有这个 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 语句中使用参数而不是用户定义的字符串更好。