[英]How to select rows that has distinct value in one field and sorted by another field in MySQL?
我有这样一张桌子:
-----------------------------
id | uid | year | other | many | fields
-----------------------------
1 | 1 | 2010 | blabla ...
2 | 2 | 1999 | blablabla ...
3 | 3 | 2011 | bla ...
4 | 1 | 2006 | blablablabla ...
...
-----------------------------
我想要的是选择所有记录中的所有字段
有不同的uid
,只返回最后一条记录(即id
最高)
结果按年份排序
返回记录的示例如:
-----------------------------
id | uid | year | other | many | fields
-----------------------------
2 | 2 | 1999 | blablabla ...
4 | 1 | 2006 | blablablabla ...
3 | 3 | 2011 | bla ...
-----------------------------
它看起来类似于问题如何在同一个SELECT语句中使用DISTINCT和ORDER BY? 但我无法让它发挥作用。
我尝试了SELECT * FROM table GROUP BY uid ORDER BY MAX(id) DESC, MAX(year)
,但似乎既没有排序id
也没有year
。
更新:
感谢所有解决方案,这里有一个新问题:我实际上是在开发Discuz中的插件,并且由于安全原因它不允许子查询,有没有办法只使用一个选择? 或者在Discuz插件开发中的任何解决方法? 再次感谢。
据我所知,我可以给你两种方法,
(1)Mysql具体
SELECT * FROM (SELECT * FROM `table_name` ORDER BY `id` DESC) tbl
GROUP BY `uid` ORDER BY `year`
注意:在Mysql中,我们不必为每个列应用GROUP BY
以获取其非聚合值,而只返回第一行。
(2)对于任何RDBMS
SELECT * FROM table_name
WHERE id IN (
SELECT Max(id) FROM table_name
GROUP BY uid
)
ORDER BY year
要么
SELECT tbl1.id, tbl1.uid, tbl1.year, tbl1.other
FROM table_name tbl1
INNER JOIN (
SELECT Max(id) id FROM table_name
GROUP BY uid
) tbl2
ON tbl1.id = tbl2.id
ORDER BY tbl1.year
以上所有陈述将产生与以下相同的结果:
----------------------------
| id | uid | year | other |
-----+-----+------+------------
| 2 | 2 | 1999 | blablabla ...
| 4 | 1 | 2006 | blablablabla ...
| 3 | 3 | 2011 | bla ...
-----------------------------
以下查询可能会完成工作。
SELECT
your_table.id,
your_table.uid,
your_table.year,
your_table.other
FROM your_table
INNER JOIN
(
SELECT
uid,
MAx(id) max_id
FROM your_table
GROUP BY uid
) t
ON your_table.id = t.max_id AND your_table.uid = t.uid
ORDER BY your_table.id, your_table.year;
上述查询将返回与同一uid
下的最大id对应的记录,并按id
和year
升序对记录进行排序。
SQL FIDDLE不起作用
测试数据:
DROP TABLE IF EXISTS `your_table`;
CREATE TABLE `your_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(50) NOT NULL,
`year` int(11) NOT NULL,
`other` varchar(100) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `your_table` VALUES ('1', '1', '2010', 'blabla ...');
INSERT INTO `your_table` VALUES ('2', '2', '1999', 'blablabla...');
INSERT INTO `your_table` VALUES ('3', '3', '2011', 'bla ...');
INSERT INTO `your_table` VALUES ('4', '1', '2006', 'blablablabla....');
输出:
对这些测试数据运行上述查询,您将获得以下输出。
id uid year other
2 2 1999 blablabla...
3 3 2011 bla ...
4 1 2006 blablablabla....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.