groupby的返回记录数为1

groupby的返回记录数为1

问题描述:

我有两个表user_expensesusersgroupby的返回记录数为1

user_expenses的外键是user_expenses.user_id,其对应于users.id

我想从两个表中获取一些信息,其中用户只有一笔费用。

我这就给了一个镜头:

SELECT 
    users.id, users.email, users.stripe_plan, users.previous_plan, 
    users.created_at, user_expenses.created_at, user_expenses.description 
FROM 
    users 
INNER JOIN 
    user_expenses ON user_expenses.user_id = users.id 
WHERE 
    user_expenses.description NOT LIKE "%free%" 
GROUP BY 
    user_expenses.user_id 
HAVING 
    COUNT(*) = 1 

但当然,这会产生以下问题:

SELECT列表是不是在GROUP BY子句中包含非聚合列“app.user_expenses。 created_at',它在功能上不依赖于GROUP BY子句中的列;这是不兼容的sql_mode = only_full_group_by

添加此列进group_by有问题,因为它实际上将返回谁有不同的描述多费用的用户。

任何人都可以提供一些建议如何解决这个问题?不管描述的类型如何,我只希望用户在user_expenses表中使用单个条目。

+0

你使用什么数据库客户端? – SandPiper

你可以做一个虚拟聚合。更改:

user_expenses.created_at, user_expenses.description 

select列表:

min(user_expenses.created_at) created_at, min(user_expenses.description) description 

...这将是一样的原始价值,因为你知道你只有每组之一。

这也将是由users.id领域,其具有的优点是它允许外部加入user_expenses表(如果有的话,你需要的是)更自然的组:

group by users.id 

注:在MySQL 5.7+不需要合计functionally dependent on the grouped-by fields的字段。由于users记录的所有字段均由users.id值确定,因此它们可以不经汇总。

你可以做任何一个子查询,或者你可以伪总不在组中的列表值:

(1):

SELECT users.id, users.email, users.stripe_plan, users.previous_plan, users.created_at, user_expenses.created_at, user_expenses.description 
FROM users 
INNER JOIN user_expenses 
ON user_expenses.user_id = users.id 
WHERE user_expenses.description NOT LIKE "%free%" 
and users.id not in 
    (select ue2.user_id from user_expenses ue2 group by user_id having count(*) > 1) 

(2)

SELECT users.id, max(users.email), max(users.stripe_plan), max(users.previous_plan), max(users.created_at), max(user_expenses.created_at), max(user_expenses.description) 
FROM users 
INNER JOIN user_expenses 
ON user_expenses.user_id = users.id 
WHERE user_expenses.description NOT LIKE "%free%" 
GROUP BY user_expenses.user_id 
HAVING COUNT(*) = 1