【问题标题】:Having SQL Query not group results让 SQL 查询不分组结果
【发布时间】:2013-10-07 15:08:27
【问题描述】:

我有一个通过user_id 连接几个表的sql 查询,问题是我想查看这些表中的所有数据。

目前我正在查询用户表和支付表,并根据user_id 加入它们。

我似乎每个 user_id 只得到一个结果,现在我知道这是要发生的事情,但是如何(如果可能)显示付款表中的所有数据(即我想查看多个显示用户已进行的各种付款的用户 ID)。

我目前正在使用左连接,我认为这可能是问题所在,但切换它仍然没有显示我正在寻找的结果。

这是我目前的加入:

from user u 
left join u_subscription us 
on u.user_id = us.user_id 
left join u_detail ud 
on u.user_id = ud.user_id

任何帮助将不胜感激。

提前致谢

纳德

完整的sql查询:

select u.user_id as 'prop:User id', u.user_username as 'prop:username', u.user_email as 'Identity',u.user_created as 'Timestamp', us.user_subscription_expires as 'prop:Expires on', us.user_subscription_payment_provider as 'prop:Payment provider', us.user_subscription_modified, ud.user_detail_signup_country_iso3 as 'prop:Country'

from user u
left outer join user_subscription us
on u.user_id = us.user_subscription_user_id
left outer join user_detail ud
on u.user_id = ud.user_detail_user_id

【问题讨论】:

  • 你能显示你正在使用的完整查询吗?听起来您可能有 GROUP BY u.user_id,但如果没有完整的查询,我们无法确定。
  • 请显示完整的查询。
  • 这很快!我尝试了左外连接,但没有运气。我没有在任何地方使用 group by。
  • 正如@newfurniturey 所说,您能否向我们展示您的完整查询?
  • 添加到编辑中。谢谢

标签: mysql sql join


【解决方案1】:

我在您的查询中没有发现任何缺陷。它应该按预期工作。

我怀疑subscriptiondetail 表中每个用户 不超过一行。这就是为什么您的 left join 为每个用户只生成一行(如果是内部连接,它会最多为每个用户生成一行)。

【讨论】:

  • 就是这个,对不起,我没有意识到!数据库已更改并覆盖用户信息,而不是添加另一行。感谢这个和所有其他建议
【解决方案2】:

我建议使用另一种方法:

select
   'your selected columns'
from
   user u,
   u_subscription us,
   u_detail ud
where 
   u.user_id = us.user_id and
   u.user_id = ud.user_id

这就像 join 方法,但对我来说,这种方法使查询更清晰,更容易理解..希望它有所帮助!

【讨论】:

  • 这在语法上相当于将 LEFT OUTER 连接切换为 INNER JOIN,因此无法解决问题。
  • 此外,您提出的方法虽然没有错,但已有 20 多年的历史,并在 ANSI 1992 中被问题中使用的显式连接语法所取代。我不想代表太多人发言,但我认为你是少数人认为这更清晰、更容易理解。 This article 给出了比我在评论中更多的切换理由
  • 啊..我明白了..谢谢@GarethD!我学到了很多东西!我通常认为我的方法更好,但现在我知道了。这篇文章内容丰富!谢谢指正。。
【解决方案3】:

由于您专门寻找详细信息/付款的内容,请使用该表作为查询的基础,然后加入用户表,因为详细信息仅基于用户存在...但是,您可以离开 -如果有条件加入订阅。类似的东西

select
      u.*,
      ud.*,
      us.*
   from
      u_detail ud
         join user u
            on ud.user_id = u.user_id
         left join u_subscription us
            on ud.user_id = us.user_id

由于从用户详细信息到用户表的用户ID 相同,因此只需使用相同的用户ID 加入订阅表即可。我通常不会对字段使用“*”,而是从中选择您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多