groupby的返回记录数为1
问题描述:
我有两个表user_expenses
和users
。groupby的返回记录数为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
表中使用单个条目。
答
你可以做一个虚拟聚合。更改:
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
你使用什么数据库客户端? – SandPiper