mysql 中group by 和select 列字段数不同
首先,这个是MySQL对标准sql的扩展
这在mysql 中是合法的。在ORACLE中会报错。
这是mysql的设计,当group by 字段和select 多字段是唯一的一个分组时,这样能提高效率。
但是如果不能唯一确定的话,mysql会随机选一个值。这是要注意的。
如果group by 字段对应的结果是多条数据,那么select字段不能唯一确定值
例如:
原数据集:
SELECT
user_id,
v.org_id,
idvisit max_idvisit,
visit_entry_idaction_url
FROM
leads_visit_time v
WHERE
v.org_id = '10171'
AND v.user_id IS NOT NULL
AND v.user_id != ''
AND visit_first_action_time >= '2019-06-01 00:00:00'
AND visit_first_action_time <= '2020-03-20 23:59:59'
AND v.user_id = '10171FK20200320155663If6z'
查询结果:
使用group by:
SELECT
user_id,
v.org_id,
idvisit max_idvisit,
visit_entry_idaction_url
FROM
leads_visit_time v
WHERE
v.org_id = '10171'
AND v.user_id IS NOT NULL
AND v.user_id != ''
AND visit_first_action_time >= '2019-06-01 00:00:00'
AND visit_first_action_time <= '2020-03-20 23:59:59'
AND v.user_id = '10171FK20200320155663If6z'
GROUP BY
user_id
查询结果:
这样的情况,max_idvisit值是不确定的,如果想取到真正的最大值对应的那条数据,使用group by是不合理的,这是一个
排序在分组,分组在排序的过程
为了解决问题,这种情况一般是做联表操作,
SELECT
a.user_id,
a.org_id,
a.idvisit,
a.first_visit_entry_idaction_url
FROM leads_visit_time AS a,
(SELECT
user_id,
org_id,
MAX(idvisit) AS max_idvisit
FROM leads_visit_time AS b
GROUP BY user_id, org_id) AS b
WHERE a.idvisit = b.max_idvisit;