Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询未按组返回预期结果_Mysql_Sql - Fatal编程技术网

Mysql 查询未按组返回预期结果

Mysql 查询未按组返回预期结果,mysql,sql,Mysql,Sql,我有点疯了。我想知道是否有人可以帮助我理解为什么这个查询没有返回预期的结果 SELECT last_name, first_name, DATE_FORMAT((tm_date), '%Y-%m-%d') AS dates, SUM(tm_hours) total FROM timecard LEFT JOIN teachers i ON i.ds_id = timecard.ds_id WHERE tm_notes != 'Lunch Break' AND tm_date

我有点疯了。我想知道是否有人可以帮助我理解为什么这个查询没有返回预期的结果

SELECT
  last_name,
  first_name,
  DATE_FORMAT((tm_date), '%Y-%m-%d') AS dates,
  SUM(tm_hours) total
FROM timecard
LEFT JOIN teachers i
  ON i.ds_id = timecard.ds_id
WHERE tm_notes != 'Lunch Break'
AND tm_date BETWEEN '2018-04-16' AND '2018-04-30'
AND timecard.ds_id = '4'
GROUP BY CONCAT(YEAR(tm_date), '/', WEEK(tm_date)),
         timecard.ds_id
ORDER BY last_name ASC, dates ASC
此查询将返回第一条记录,如同该周开始于2018-04-20,但应为2018-04-16。当我为其他用户timecard.ds_id运行此查询时,查询总是返回2018-04-16作为第一条记录,我不明白为什么这个特定用户显示2018-04-20

这就是结果

这是示例数据


谢谢你

因为它是按周分组的,你可能不会总是得到你想要的结果。如果需要最早的结果,请使用
MIN

DATE_FORMAT(MIN(tm_date), '%Y-%m-%d') AS dates,

因为它是按周分组的,所以你可能并不总能得到你想要的结果。如果需要最早的结果,请使用
MIN

DATE_FORMAT(MIN(tm_date), '%Y-%m-%d') AS dates,

当选择未包含group by子句且未提供给聚合函数的列时,MySQL会从分组行中选择任意的
tm_date
行。(这是一个设置;您可以更改它,MySQL将抛出一个异常)

你必须告诉MySQL你想要什么。我认为
MIN
在这里起作用

DATE_FORMAT(MIN(tm_date), '%Y-%m-%d') AS dates,

当选择未包含group by子句且未提供给聚合函数的列时,MySQL会从分组行中选择任意的
tm_date
行。(这是一个设置;您可以更改它,MySQL将抛出一个异常)

你必须告诉MySQL你想要什么。我认为
MIN
在这里起作用

DATE_FORMAT(MIN(tm_date), '%Y-%m-%d') AS dates,

以下是Terminus指定的MySQL文档。这本书值得一读

如果仅禁用了_FULL _GROUP _BY,则GROUP BY标准SQL使用的MySQL扩展允许select list、HAVING condition或ORDER BY list引用未聚合的列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的。此外,添加ORDERBY子句不会影响从每个组中选择值。结果集排序发生在选择值之后,排序依据不影响服务器在每个组中选择的值。如果您知道由于数据的某些属性,每个未在GROUP BY中命名的非聚集列中的所有值对于每个组都相同,则仅禁用_FULL_GROUP_BY非常有用


以下是Terminus指定的MySQL文档。这本书值得一读

如果仅禁用了_FULL _GROUP _BY,则GROUP BY标准SQL使用的MySQL扩展允许select list、HAVING condition或ORDER BY list引用未聚合的列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的。此外,添加ORDERBY子句不会影响从每个组中选择值。结果集排序发生在选择值之后,排序依据不影响服务器在每个组中选择的值。如果您知道由于数据的某些属性,每个未在GROUP BY中命名的非聚集列中的所有值对于每个组都相同,则仅禁用_FULL_GROUP_BY非常有用


样本数据和预期结果将有所帮助。如果您可以简化查询,这也很有帮助。请使用适当的
分组方式。列
first_name
last_name
甚至不在group by中。该查询依赖于特定于MySQL的非标准扩展名
group by
;对于选择列表中不在GROUP BY(或功能上依赖于GROUP BY中的表达式)中的非聚合表达式,返回的值是不确定的。样本数据和预期结果将有所帮助。如果您可以简化查询,这也很有帮助。请使用适当的
分组方式。列
first_name
last_name
甚至不在group by中。该查询依赖于特定于MySQL的非标准扩展名
group by
;对于选择列表中不在GROUP BY(或功能上依赖于GROUP BY中的表达式)中的非聚合表达式,返回的值是不确定的。非常感谢你!!!!我刚刚学到了一些新东西!我真的很感激谢谢你!!!!我刚刚学到了一些新东西!我真的很感激汉克斯,我的谷歌浏览器今天很弱。谢谢,我的谷歌浏览器今天很弱。