首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择在一个字段中具有不同值并在MySQL中按另一个字段排序的行?

如何选择在一个字段中具有不同值并在MySQL中按另一个字段排序的行?
EN

Stack Overflow用户
提问于 2016-06-05 04:33:12
回答 3查看 1.5K关注 0票数 3

我有一张这样的桌子:

代码语言:javascript
复制
-----------------------------
id | uid | year | other | many | fields
-----------------------------
1  | 1   | 2010 | blabla ...
2  | 2   | 1999 | blablabla ...
3  | 3   | 2011 | bla ...
4  | 1   | 2006 | blablablabla ...
...
-----------------------------

我想要的是选择所有记录中的所有字段

  1. 具有不同的uid,并且只返回最后一个记录(即具有最高的id)
  2. 结果按年排序。

返回的记录示例如下:

代码语言:javascript
复制
-----------------------------
id | uid | year | other | many | fields
-----------------------------
2  | 2   | 1999 | blablabla ...
4  | 1   | 2006 | blablablabla ...
3  | 3   | 2011 | bla ...
-----------------------------

它看起来类似于问题How to use DISTINCT and ORDER BY in same SELECT statement?,但我无法让它工作。

我尝试了SELECT * FROM table GROUP BY uid ORDER BY MAX(id) DESC, MAX(year),但它似乎既没有排序id也没有year

最新情况:

感谢所有的解决方案,这里有一个新的问题:我实际上在Discuz中开发插件,而且出于安全原因它不允许子查询,有任何方法只使用一种选择吗?或者在Discuz插件开发中有什么解决办法?再次感谢。

EN

回答 3

Stack Overflow用户

发布于 2016-06-05 06:00:16

据我所知,我可以给你两条路,

(1) Mysql专用

代码语言:javascript
复制
SELECT * FROM (SELECT * FROM `table_name` ORDER BY `id` DESC) tbl
GROUP BY `uid` ORDER BY `year`

注意:在Mysql中,我们不必将GROUP BY应用于每一列以获得其非聚合值,而是只返回第一行。

(2)用于任何关系数据库管理系统

代码语言:javascript
复制
SELECT * FROM table_name 
WHERE id IN ( 
    SELECT Max(id) FROM table_name
    GROUP BY uid
)
ORDER BY year

代码语言:javascript
复制
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

上述所有声明将产生如下相同的结果:

代码语言:javascript
复制
----------------------------
| id | uid | year | other | 
-----+-----+------+------------
| 2  | 2   | 1999 | blablabla ...
| 4  | 1   | 2006 | blablablabla ...
| 3  | 3   | 2011 | bla ...
-----------------------------
票数 2
EN

Stack Overflow用户

发布于 2016-06-05 06:03:33

你可以试试这个

代码语言:javascript
复制
select distinct * from test where id IN (select MAx(id) id from test GROUP BY uid) order by year 

test=>table名称;它将发出put作为

票数 2
EN

Stack Overflow用户

发布于 2016-06-05 05:36:06

下面的查询可能执行已完成的工作。

代码语言:javascript
复制
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;

上述查询将返回与最大值id对应的记录,并按idyear的升序对记录进行排序。

SQL快捷键不工作

测试数据:

代码语言:javascript
复制
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....');

输出:

对这些测试数据运行上面的查询,您将得到以下输出。

代码语言:javascript
复制
id     uid      year     other 

2       2       1999    blablabla...
3       3       2011    bla ...
4       1       2006    blablablabla....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37638491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档