假设我有一个messages用列调用的表:
id | from_id | to_id | subject | message | timestamp
Run Code Online (Sandbox Code Playgroud)
我想只收到每个用户的最新消息,就像您在深入了解实际线程之前在FaceBook收件箱中看到的那样.
这个查询似乎让我接近我需要的结果:
SELECT * FROM messages GROUP BY from_id
Run Code Online (Sandbox Code Playgroud)
但是,查询给了我每个用户最早的消息,而不是最新消息.
我无法想出这个.
为什么SQL要求我指定要分组的属性?为什么不能只使用所有非聚合?
如果一个属性没有被聚合而且不在GROUP BY子句中,那么非确定性选择将是唯一的选择,假设元组是无序的(mysql有点这样)并且这是一个巨大的问题.据我所知,Postgresql要求必须聚合未出现在GROUP BY中的所有属性,这强化了它是多余的.
在本书中我正在阅读关于数据库的课程,下面给出了使用聚合运算符的非法查询示例:
找出最老的水手的名字和年龄.
请考虑以下尝试回答此查询:
Run Code Online (Sandbox Code Playgroud)SELECT S.sname, MAX(S.age) FROM Sailors S目的是使该查询不仅返回最大年龄,还返回具有该年龄的水手的姓名.但是,此查询在SQL中是非法的 - 如果SELECT子句使用聚合操作,则它必须仅使用聚合操作,除非查询包含GROUP BY子句!
一段时间后,在使用MySQL进行练习时,我遇到了类似的问题,并犯了类似于上面提到的错误.然而,MySQL没有抱怨,只是吐了一些表,后来证明不是我需要的.
以上查询在SQL中是否真的非法,但在MySQL中是合法的,如果是,那为什么呢?在什么情况下需要进行这样的查询?
进一步阐述问题:
问题不在于是否也应在GROUP BY中提及SELECT中提到的所有属性.这就是为什么上面的查询,使用属性和属性上的聚合操作,没有任何GROUP BY在MySQL中是合法的.
让我们说Sailors表看起来像这样:
+----------+------+
| sname | age |
+----------+------+
| John Doe | 30 |
| Jane Doe | 50 |
+----------+------+
Run Code Online (Sandbox Code Playgroud)
然后查询将返回:
+----------+------------+
| sname | MAX(S.age) |
+----------+------------+
| John Doe | 50 |
+----------+------------+
Run Code Online (Sandbox Code Playgroud)
现在谁需要那个?John Doe不是50岁,他是30岁!正如本书引用中所述,这是第一次尝试获得最年长水手的名字和年龄,在这个例子中,Jane Doe在50岁时.
SQL会说这个查询是非法的,但是MySQL只是进行并吐出"垃圾".谁需要这种结果?为什么MySQL会为新手提供这个小陷阱?
我在数据库中有一个表,我想在某些条件下从中选择最新的行.
我做了一个小提琴来更好地解释我的需求.
如您所见,我已经尝试创建一个查询来获取我想要的数据.但不幸的是,我不仅获得了最新的行,而且实际上每行都符合条件但是日期.
我试着用伪sql解释我想要的东西:
SELECT * FROM test WHERE date = Max(date) AND user = 'Timmy';
Run Code Online (Sandbox Code Playgroud)
编辑:似乎并不完全清楚我想要什么.'date'描述了配置文件的创建日期.所以我想得到'Timmy'的最新资料.
我正在读一本关于SQL的书(Sams在10分钟内自学SQL),尽管它的标题很好.然而关于小组的章节让我感到困惑
"分组数据是一个简单的过程.所选列(查询中SELECT关键字后面的列列表)是可以在GROUP BY子句中引用的列.如果在SELECT语句中找不到列,则不能在GROUP BY子句中使用.如果你考虑它,这是合乎逻辑的 - 如果没有显示数据,你如何在报告上对数据进行分组?"
为什么我在MySQL中运行这个语句呢?
select EMP_ID, SALARY
from EMPLOYEE_PAY_TBL
group by BONUS;
Run Code Online (Sandbox Code Playgroud)