SQL。如何管理运营商GROUP BY

时间:2012-03-21 01:24:41

标签: mysql sql group-by

我可以对运营商GROUP BY的结果产生影响吗?这正是将从查询结果和要离开的内容中删除的内容。例如,在我将JOIN应用于两个表之后,我得到以下结果:

first screen http://s019.radikal.ru/i602/1203/ba/016c3fcf5e4d.jpg

现在,在我追加到我的查询后

... GROUP BY firstname

我得到以下内容:

first screen http://s019.radikal.ru/i636/1203/b4/dcf6aaaebdf7.jpg

但是为什么在第二行中删除它?为什么不删除第一行?

如果我使用GROUP BY,我可以通过某种方式影响它吗?


查询(从评论中转录):

SELECT p.id, p.firstname, a.auto
  FROM persons AS p INNER JOIN auto AS a ON p.id = a.person_id

SELECT p.id, p.firstname, a.auto
  FROM persons AS p INNER JOIN auto AS a ON p.id = a.person_id
 GROUP BY p.firstname

如何正确编写查询?

我尝试使用ORDER BY来解决我的问题。但GROUP BY必须始终在ORDER BY之前。因此,在这种情况下,它无法帮助我。

2 个答案:

答案 0 :(得分:2)

你必须使用MySQL。

您的第一个查询必须类似于:

SELECT id, firstname, auto
  FROM AnonymousTable;

您的第二个查询类似于:

SELECT id, firstname, auto
  FROM AnonymousTable
 GROUP BY firstname;        -- Non-standard; MySQL only

在标准SQL中,如果您有GROUP BY子句,则必须在GROUP BY子句中列出select-list中的所有非聚合值(因此第二个查询在标准SQL中格式不正确)。只有MySQL允许您将SELECT-list中的非聚合值保留在GROUP BY子句之外。

使用此功能时,选择哪些值是很随意的。对于某些人(如id列),结果是确定性的,因为对于给定的id(在示例数据中),组中的所有行都具有相同的firstname值。对于其他人(如auto列),所选值是任意的。

如果您有以下数据:

id    firstname     auto
1     Alex          BMW
1     Alex          Audi
2     Jakob         Opel
3     Alex          Honda

对于名称id Alex列中显示哪个值将不再具有确定性(它可能是1或3),并且汽车的模型仍然是不确定的。

答案 1 :(得分:0)

group by是一个聚合函数(例如,与该组匹配的行数) - 所以你“丢失行”。

此网站可能会帮助您:http://www.w3schools.com/sql/sql_groupby.asp

也许你的意思是按那行排序?