2

如果我使用以下查询:

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

问题一:

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

问题2:

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

4

3 回答 3

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 上已经被问和回答了数百次。点击链接并阅读许多解决方案。

于 2013-10-15T14:38:10.867 回答
1

您可以试验并查看返回了哪些唯一行,您可以试验并查看它们以何种顺序返回,但这只会向您展示今天在当前数据库引擎版本下的试验表的结果. 底线:

  • 如果你SELECT DISTINCT commentid无关紧要的,因为它不在你的SELECT
  • 如果您不这样做ORDER BY,数据库将确定顺序。

如果您想要最近的不同评论及其 ID,这将每次都有效(完全披露:这取代了一个有效但过度思考问题的早期答案):

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

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

于 2013-10-15T14:52:16.517 回答
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,那么将返回所有不同的行,在您的情况下是所有表。

于 2013-10-15T14:38:12.217 回答