区别 - 采取了哪些项目?第一次或最后一次?

时间:2013-10-15 14:31:15

标签: mysql sql distinct greatest-n-per-group

如果我使用以下查询:

SELECT DISTINCT comment FROM table;

我有以下数据:( ID就在那里显示订单......)

ID | comment
-------------
1  | comment1
2  | comment1
3  | comment2
4  | comment1

我能得到的是以下三个结果:

结果1:

1  | comment1
3  | comment2

结果2:

3  | comment2
4  | comment1

结果3:

order is unpredicatable

问题1:

结果是否与平台无关?我可以确定,我总能获得可预测的结果吗?

问题2:

我想区分选择所有评论并仅获得最新评论,这意味着我希望始终获得结果2.是否有可能实现这一点?也许按键排序会影响结果吗?

3 个答案:

答案 0 :(得分:2)

您的查询不会请求ID列,只会请求注释列:

SELECT DISTINCT comment FROM table;

在结果中,不包括ID,因此每个值来自的行都无关紧要。

comment1
comment2

至于如何对它们进行排序,我认为这取决于索引顺序。我会做一个测试来确认:

mysql> create table t (id int primary key, comment varchar(100));

mysql> insert into t values
    -> (1, 'comment2'),
    -> (2, 'comment1'),
    -> (3, 'comment2'),
    -> (4, 'comment1');

默认顺序是主键的顺序:

mysql> select distinct comment from t;
+----------+
| comment  |
+----------+
| comment2 |
| comment1 |
+----------+

如果我们在请求的列上有索引,它将按索引顺序返回值:

mysql> create index i on t(comment);

mysql> select distinct comment from t;
+----------+
| comment  |
+----------+
| comment1 |
| comment2 |
+----------+

我假设InnoDB存储引擎,因为每个人都应该使用InnoDB。 ; - )


您的上一个问题表明您确实需要一个完全不涉及DISTINCT的查询,但这是一个问题。这类问题很常见,在StackOverflow上已被问及并回答了数百次。点击链接阅读许多解决方案。

答案 1 :(得分:1)

您可以尝试并查看返回哪些唯一行,并且您可以尝试并查看它们返回的顺序,但这只会向您显示今天在实验表中的结果数据库引擎版本。底线:

  • 如果您SELECT DISTINCT comment id并不重要,因为它不在SELECT
  • 如果您没有ORDER BY,数据库将确定订单。

如果你想要最新的不同评论及其ID,那么每次 完全披露:这取代了之前有效但过度考虑问题的答案):

SELECT comment, MAX(id)
FROM myTable
GROUP BY comment
ORDER BY 2 DESC;

请注意,ORDER BY 2 DESC假设ID越高,评论越新。

答案 2 :(得分:0)

如果您选择一个不同的列,则不会返回另一个。

select distinct column from table

的结果相同
select column from table group by column

在这两种情况下,列的排序顺序是不可预测的,具体取决于执行计划,该计划可能因数据量较大,表结构不同,数据库版本不同而不同

模仿你的结果,你必须这样做:

select id, column from table group by column

这是非法分组。如果您的SQL模式允许它运行,则ID将是随机的。

如果您的意思是select distinct * from table,那么将返回所有不同的行,在您的情况下将返回所有表格。