如果我使用以下查询:
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.是否有可能实现这一点?也许按键排序会影响结果吗?
答案 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的查询,但这是一个greatest-n-per-group问题。这类问题很常见,在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
,那么将返回所有不同的行,在您的情况下将返回所有表格。