看到一个帖子里出的错误是把col in (“a”, “b”)写成”a” or “b”
http://bbs.csdn.net/topics/391939390
那么问题来了,mysql在parse中允许对字符串做这样的语法,是什么目的,为什么符合语法,具体做了什么操作,实践中有什么用呢?百思不得其JIE
MariaDB > select "a" or "b";
+--+
| "a" or "b" |
+--+
| 0 |
+--+
1 row in set, 4 warnings (0.00 sec)
MariaDB > select "a" and "b";
+--+
| "a" and "b" |
+--+
| 0 |
+--+
1 row in set, 3 warnings (0.00 sec)
解决方案
20
引用 4 楼 gikod 的回复:
Quote: 引用 3 楼 yupeigu 的回复:
Quote: 引用 2 楼 gikod 的回复:
Quote: 引用 1 楼 yupeigu 的回复:
本人刚才在sql server上试了一下这个语法是会报错的。
所以,这个语法应该是mysql特有的,至于这个语句这么写,能否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。
不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过
是吧,本人用Oracle比较多,也不能这么用,真是惊叹MySQL的神奇。
所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。
说到这里,还有一个 mysql特有的语法:
select *
from xx
group by id
这个语法也能运行。这个语句就很有用处
好神奇的语法,
别卖关子,说说能用来做什么?
MariaDB > select * from t;
+--+--+--+
| id | val | val2 |
+--+--+--+
| 1 | 1 | NULL |
| 2 | 2 | NULL |
| 3 | 3 | NULL |
| 4 | 4 | NULL |
| 5 | 5 | NULL |
| 6 | 1 | 1 |
| 7 | 2 | 2 |
| 8 | 3 | 3 |
| 9 | 4 | 4 |
| 10 | 5 | 5 |
+--+--+--+
10 rows in set (0.00 sec)
MariaDB > select * from t group by id;
+--+--+--+
| id | val | val2 |
+--+--+--+
| 1 | 1 | NULL |
| 2 | 2 | NULL |
| 3 | 3 | NULL |
| 4 | 4 | NULL |
| 5 | 5 | NULL |
| 6 | 1 | 1 |
| 7 | 2 | 2 |
| 8 | 3 | 3 |
| 9 | 4 | 4 |
| 10 | 5 | 5 |
+--+--+--+
10 rows in set (0.00 sec)
MariaDB > select * from t group by val;
+--+--+--+
| id | val | val2 |
+--+--+--+
| 1 | 1 | NULL |
| 2 | 2 | NULL |
| 3 | 3 | NULL |
| 4 | 4 | NULL |
| 5 | 5 | NULL |
+--+--+--+
5 rows in set (0.00 sec)
MariaDB > select * from t group by val2;
+--+--+--+
| id | val | val2 |
+--+--+--+
| 1 | 1 | NULL |
| 6 | 1 | 1 |
| 7 | 2 | 2 |
| 8 | 3 | 3 |
| 9 | 4 | 4 |
| 10 | 5 | 5 |
+--+--+--+
6 rows in set (0.00 sec)
一般用来求某个数据中,最新的数据,例如张三 ,在1号上传了1条数据,3号上传了一条数据,
通过这个语法,可以比较容易的求出张三在3号上传的数据