gpt4 book ai didi

mysql - 按 LEFT JOIN 内部排序

转载 作者:行者123 更新时间:2023-11-29 09:32:19 24 4
gpt4 key购买 nike

我正在尝试编写一个查询。我已经成功一半了,但是我在 LEFT JOIN 方面遇到了问题。

我有三个表:

  • 用户
  • 用户偏好
  • user_subscription_plan

用户始终有一个 user_preference,但 user_subscription_plan 中可以有多个条目,也可以没有条目

如果用户在 user_subscription_plan 中没有条目,或者只有一个条目,那么我的 sql 就可以工作。如果我有不止一个,那么我就有问题了。 如果有两个条目,如何才能返回最后输入的一个?我尝试使用 ORDER 语句,但它无法按预期工作。不知怎的,我得到了空行。

这是我的查询:

SELECT u.id AS GYM_USER_ID, subscription_plan.id AS subscriptionId, up.onboarding_completed AS CompletedOnboarding,
(CASE
WHEN ((up.onboarding_completed = 1)
AND (ISNULL(subscription_plan.id)))
THEN 'freemiun'
WHEN (ISNULL(up.onboarding_completed)
AND (ISNULL(subscription_plan.id)))
THEN 'not_paying'
END) AS subscription_status
FROM user AS u
INNER JOIN user_preferences up ON up.user_id = u.id
LEFT JOIN (
SELECT * FROM user_subscription_plan AS usp ORDER BY usp.id DESC LIMIT 1
) AS subscription_plan ON subscription_plan.user_id = u.id
GROUP BY u.id;

如果我按原样运行它,则 subscription_plan.id AS subscriptionId 始终为空。如果我删除 LIMIT 子句,那么它不为空,但我仍然得到第一个条目,这在我的情况下是错误的

我还有更多的案例要处理,但在解决这个问题之前我无法处理。

最佳答案

请尝试使用“max(usp.id)”即“group by subscription_plan.user_id”而不是限制1。

如果在子查询中限制1,则子查询的结果将始终只返回1条记录(如果表有数据)。所以上面的查询可以这样重写。

抱歉,我没有测试,因为我没有数据,但请尝试一下,希望这能有所帮助。

SELECT 
u.id AS GYM_USER_ID,
subscription_plan.id AS subscriptionId,
up.onboarding_completed AS CompletedOnboarding,
(CASE
WHEN
((up.onboarding_completed = 1)
AND (ISNULL(subscription_plan.id)))
THEN
'freemiun'
WHEN
(ISNULL(up.onboarding_completed)
AND (ISNULL(subscription_plan.id)))
THEN
'not_paying'
END) AS subscription_status
FROM
user AS u
INNER JOIN
user_preferences up ON up.user_id = u.id
LEFT JOIN
(SELECT
usp.user_id, MAX(usp.id)AS id
FROM
user_subscription_plan AS usp
GROUP BY usp.user_id) AS subscription_plan ON subscription_plan.user_id = u.id;

关于mysql - 按 LEFT JOIN 内部排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58433285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com