上一章节我们学习了 SQL DISTINCT 的位置对结果的影响。但我们还没深入到 MySQL DISTINCT 关键字的核心用法,同时,我们也还未讲解 DISTINCT 有无小括号是否有影响等,这些,我们会在这一章节全部讲完。
DISTINCT 中的小括号 ()
「 SQL 解析器会忽略 DISTINCT 关键字后面的小括号,而把 DISTINCT 关键字后面的所有列都作为唯一条件 」
我们来看看几个实例
mysql> SELECT DISTINCT(user) FROM fruits;
+-------+
| user |
+-------+
| yufei |
| hero |
+-------+
2 rows in set (0.06 sec)
当只有一列时有两条记录
mysql> SELECT DISTINCT(user),fruit FROM fruits;
+-------+--------+
| user | fruit |
+-------+--------+
| yufei | apple |
| yufei | banana |
| yufei | peach |
| hero | apple |
| hero | peach |
| hero | pear |
+-------+--------+
6 rows in set (0.00 sec)
当带括号时,user
列放在括号内,fruit
放在括号外,会发现有五条记录,而 fruit
也参与了唯一条件检查
mysql> SELECT DISTINCT(fruit),owns FROM fruits;
+--------+------+
| fruit | owns |
+--------+------+
| apple | 3 |
| banana | 5 |
| peach | 3 |
| pear | 5 |
+--------+------+
4 rows in set (0.02 sec)
当使用 fruit
时就会有 4 条记录 ,因为有两条 apple 3
。
但是,如果把 fruit
和 owns
都放在括号内,是会报错的
mysql> SELECT DISTINCT(fruit,owns) FROM fruits;
ERROR 1241 (21000): Operand should contain 1 column(s)
好诡异,我暂时还想不到如何解释这种结果
SQL DISTINCT 的基本用法
在日常使用 DISTINCT 关键字时,一般有以下几种
注意: 请留意每种的列的数量
- 单独获取某一列不重复的值
这种情况下,有无小括号的结果是一样的
mysql> SELECT DISTINCT user FROM fruits; +——-+ | user | +——-+ | yufei | | hero | +——-+
mysql> SELECT DISTINCT(user) FROM fruits; +——-+ | user | +——-+ | yufei | | hero | +——-+
-
单独获取某一列不重复值的数量
mysql> SELECT COUNT(DISTINCT(user)) FROM fruits; +———————–+ | COUNT(DISTINCT(user)) | +———————–+ | 2 | +———————–+
-
以多列作为条件获取不同的值
一定要记住,当你使用多列时,并不仅仅时使用小括号内的列,而是全部列
mysql> SELECT DISTINCT(user),fruit FROM fruits; +——-+——–+ | user | fruit | +——-+——–+ | yufei | apple | | yufei | banana | | yufei | peach | | hero | apple | | hero | peach | | hero | pear | +——-+——–+
有可能你仅仅时想返回唯一的 user
列然后附带 fruit
列,比如你想要的结果是这样的
+-------+--------+
| user | fruit |
+-------+--------+
| yufei | apple |
| hero | apple |
+-------+--------+
单独的 DISTINCT 关键字并不能实现这样的效果,而且也没有任何意义,因为每个 user
都有三条记录,为什么会单独返回 apple
?
如果你真需要这样的结果,有两种方法
- 附带 SQL WHERE 子句 子句
mysql> SELECT DISTINCT(user),fruit FROM fruits WHERE fruit='apple'; +-------+-------+ | user | fruit | +-------+-------+ | yufei | apple | | hero | apple | +-------+-------+
在这种语句下,
fruit
返回的值是固定的 -
使用 GROUP BY 子句
mysql> SELECT DISTINCT(user),fruit FROM fruits GROUP BY user; +-------+-------+ | user | fruit | +-------+-------+ | hero | apple | | yufei | apple | +-------+-------+
这种情况下返回的
fruit
是不固定的,虽然,有时候是按照 id 的顺序取值,但并不保障
结束语
只能说,好诡异的 DISTINCT 关键字。使用的时候尽可能的保证列的简单,最好,只使用一列
最新评论
命令: nload
真是个良心站点哇,大公无私,爱了爱了
还可以直接搞一张映射表,存 uid | time | source_index, 第一次直接查对应的 time 选出前100, 第二次直接用 CompleteFuture 去分别用 source_in
干得漂亮,多个朋友堵条路
2021.2.2版本的不适用吧
现在还可以用么
激活码有用,感谢分享
激活码的地址打不开了