mysql 为什么我的查询只显示一个结果?

fae0ux8s  于 2023-03-07  发布在  Mysql
关注(0)|答案(3)|浏览(469)

为什么我从下面的查询中只得到一个结果?建议的“答案”的名字是“Susan”,而不是我在结果中得到的名字。

SELECT EmpFirstName, EmpLastName, p.ProductName as ProductName, 
YEAR(c.OrderDate) AS Year, 
SUM(o.QuotedPrice + o.QuantityOrdered) AS TotalValue 
FROM Employees 
NATURAL JOIN Products p 
NATURAL JOIN Order_Details o 
NATURAL JOIN Orders c 
ORDER BY Year, TotalValue DESC

结果图像

表结构的图像

8xiog9wr

8xiog9wr1#

因为查询中有一个Sum

wtzytmuj

wtzytmuj2#

查询返回的结果与您的预期不符,因为查询无效。而且您的预期不正确。
SELECT子句的表达式中存在aggregate ( GROUP BY ) function需要存在GROUP BY子句。如果不存在这样的子句,SQL标准会自动添加GROUP BY 1子句,该子句将从所有选定行中仅生成一个组。
出现在GROUP BY查询的SELECT子句中的每个表达式都必须遵循以下规则之一,才能获得有效的SQL查询:
1.它也出现在GROUP BY子句中;
1.它是对aggregate ( GROUP BY ) function的调用
1.在功能上依赖于GROUP BY子句中出现的一列。
由于查询没有GROUP BY子句,因此SELECT子句中的表达式EmpFirstNameEmpLastNamep.ProductNameYEAR(c.OrderDate)无效。
在5.7.5之前的版本中,MySQL允许这样的无效SQL查询,但是它保留了return indeterminate values的特权来处理无效的表达式。
从5.7.5版本开始,MySQL可以正确地处理这些查询并拒绝它们,而其他RDBMS-es在很多年前就可以正确地处理它们。
对不确定值的解释很简单:JOINWHERE子句从表中提取一些行(s)。GROUP BY子句仅从所有这些行生成一条记录。GROUP BY查询从不从表中返回行,它生成放入结果集中的值。由于组中EmpFirstName有多个不同的值,SQL标准规定查询无效,MySQL过去常常忽略该标准,但它没有从SELECT子句的EmpFirstName表达式中选取什么值的有效规则,组中各行的任何值都是有效的,这就是它返回的值:从该组中选择一个随机值。
为了得到预期的结果,您必须按OrderNumberProductNumber对行进行分组(以及EmployeeID以获得有效的SQL查询):

9avjhtql

9avjhtql3#

这里我遇到了"同样的问题",但是使用了count(),所以我将问题添加到子查询中,并且工作正常。请记住,将所有条件(包括where)放入子查询中,以便正常工作。请尝试以下操作:

SELECT M.Id, M.Name,
(SELECT count(L.Id) FROM tblog as L where L.Id = M.Id) as qttlog 
from `tbmember` as M
where M.Id <> 0 and M.Name <> '' 
ORDER BY M.Id asc;

sum()的变化-
您的代码:

SELECT EmpFirstName, EmpLastName, p.ProductName as ProductName, 
YEAR(c.OrderDate) AS Year, 
(SUM(o.QuotedPrice + o.QuantityOrdered) FROM Order_Details as o WHERE 'condition here') AS TotalValue 
FROM Employees 
NATURAL JOIN Products p 
NATURAL JOIN Orders c 

WHERE 'condition here'

ORDER BY Year;

我已经在您的代码中做了更改,并删除了TotalValue DESC,因为de reference不起作用(不知道为什么),但列将具有名称。
您忘记了order by前面的where子句
并且您还需要通知子查询中的where子句,不要忘记这一点!
希望对你有帮助
附注:
在子查询内部,您可以与子查询之前选择的所有属性进行比较(仅注意子查询之前的逗号-因为它是选择的最后一个元素)先看代码,我与子查询之前选择的M. Id进行比较)

  • 记住:where子句使一切更安全,主要是更新和删除

我发现了些东西,也许能帮上忙:* * 之后按年份排序,**

(SUM(o.QuotedPrice + o.QuantityOrdered) FROM Order_Details as o WHERE 'condition here') ASC ;

这使得引用在where子句中,并且也适用于order by!

相关问题