我有一个返回以下数据集(Original Image)的查询:
+ ------------- + -------- + ---------- + ------------------------ + ------------------- + --------- + ----------------------- + ---------------------- + ----------------- +
| col_0_0_ | col_1_0_ | col_2_0_ | col_3_0_ | col_4_0_ | col_5_0_ | col_6_0_ | col_7_0_ | col_8_0_ |
+ ------------- + -------- + ---------- + ------------------------ + ------------------- + --------- + ----------------------- + ---------------------- + ----------------- +
| LAI-100003662 | dsa | 4546576766 | dfdfdfd2@lendingkart.com | 2015-11-30 02:30:11 | Sultanpur | Incomplete Applications | Application Incomplete | Documents Pending |
| LAI-100003662 | dsa | 4546576766 | dfdfdfd2@lendingkart.com | 2015-11-30 02:30:11 | Sultanpur | Incomplete Applications | Null | Null |
+ ------------- + -------- + ---------- + ------------------------ + ------------------- + --------- + ----------------------- + ---------------------- + ----------------- +
现在当我应用 GROUPBY col_0_0 时,对于产生此数据集的查询,我只得到一行(Original Image):
+ ------------- + -------- + ---------- + ------------------------ + ------------------- + --------- + ----------------------- + ---------------------- + ----------------- +
| col_0_0_ | col_1_0_ | col_2_0_ | col_3_0_ | col_4_0_ | col_5_0_ | col_6_0_ | col_7_0_ | col_8_0_ |
+ ------------- + -------- + ---------- + ------------------------ + ------------------- + --------- + ----------------------- + ---------------------- + ----------------- +
| LAI-100003662 | dsa | 4546576766 | dfdfdfd2@lendingkart.com | 2015-11-30 02:30:11 | Sultanpur | Incomplete Applications | Application Incomplete | Documents Pending |
+ ------------- + -------- + ---------- + ------------------------ + ------------------- + --------- + ----------------------- + ---------------------- + ----------------- +
1)为什么GROUP BY
只给我原始数据集的第一行而不是第二行?
2)GROUP BY
在这种情况下如何实际运作?
使用GROUP BY的SQL QUERY:
select loan0_.col_0_0_,
loan0_.col_1_0_,
loan0_.col_2_0_,
loan0_.col_3_0_,
loan0_.col_4_0_,
loan0_.col_5_0_,
dsastatus2_.col_6_0_,
dsastatus2_.col_7_0_,
dsastatus2_.col_8_0_
FROM loan0_
cross join user1_
cross join dsastatus2_
where loan0_.L_USER_ID=user1_.U_GUID
and loan0_.L_LEADSOURCE='DSA'
and (loan0_.L_SUB_STATUS_ID=dsastatus2_.ADMIN_STATUS_ID
or loan0_.L_STATUS_ID=dsastatus2_.ADMIN_STATUS_ID)
and user1_.U_REFID='dsa001'
and (loan0_.L_APPLICATION_ID like 'LAI-100003662')
GROUP BY col_0_0_ ;
答案 0 :(得分:0)
直接回答问题::
1)为什么GROUP BY只给我原始数据集中的第一行而不是第二行? 因为这是MSQL引擎的工作方式。阅读文档。 “服务器可以自由选择每个组中的任何值(不在组中),因此除非它们相同,否则所选择的值是不确定的”
2)GROUP BY如何在这种情况下实际工作? 见上文
MySQL扩展群组直接引用文档:
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
SQL99及更高版本允许每个可选功能T301使用这些非聚合,如果它们在功能上依赖于GROUP BY列:如果name和custid之间存在这种关系,则查询是合法的。例如,这就是客户的主要关键。
MySQL 5.7.5及更高版本实现了对功能依赖的检测。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下是这样),MySQL拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖于它们的非聚合列。 (在5.7.5之前,MySQL不检测功能依赖性,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前行为的描述,请参阅MySQL 5.6参考手册。)
如果禁用ONLY_FULL_GROUP_BY,则对GROUP BY的标准SQL使用的MySQL扩展允许选择列表,HAVING条件或ORDER BY列表引用非聚合列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会发生结果集排序,ORDER BY不会影响服务器选择的每个组中的值。禁用ONLY_FULL_GROUP_BY主要是因为您知道由于数据的某些属性,每个未在GROUP BY中命名的非聚合列中的所有值对于每个组都是相同的。
答案 1 :(得分:0)
您只看到一行的原因是因为这是GROUP BY所做的 - 它将具有相同值的记录合并为一个。在这种情况下,值为LAI-1000 ... 3662是一个值。
现在在大多数SQL系统上,如果你包含不在group by或aggregate函数中的列,它会给你一个错误,但在mysql上它只是给你一个随机值来自其他列的可能性。