需要获取用户的所有地址。已有查询,但无法正确留下连接地址

Posted

技术标签:

【中文标题】需要获取用户的所有地址。已有查询,但无法正确留下连接地址【英文标题】:need to get all addresses for users. already have query, but can't left join address properly 【发布时间】:2016-02-24 00:21:16 【问题描述】:

我正在尝试从数据库中提取我的所有客户信息。 我需要获取用户的所有地址。

我有一个用户表和地址表。地址表为每个用户保存 0 个地址。我需要加入我现有查询的每个用户的所有地址,并且我不介意每个地址重复的用户信息

到目前为止,我有这个查询,它返回所有客户数据,与区域表连接以获取货币名称,并与订单左连接以获取该用户的已发货订单总数。

SELECT ( CASE
       WHEN u.password IS NULL THEN 'GUEST'
       ELSE 'CUSTOMER'
     END )                                 AS STATUS,
   u.date_created                          AS DateCreated,
   u.NAME                                  AS UserName,
   u.password                              AS Password,
   u.email                                 AS Email,
   r.token                                 AS Currency,
   Cast(u.balance / 100 AS DECIMAL(10, 2)) AS Balance,
   Count(o.user_id)                        AS TotalShippedOrders
FROM   [db].[user] u
   INNER JOIN [db].[region] r
           ON r.currency_id = u.balance_currency
   LEFT JOIN [db].[order] o
          ON o.user_id = u.id
             AND o.status = 'shipped'
 GROUP  BY u.id,
      u.date_created,
      u.NAME,
      u.password,
      u.email,
      r.token,
      u.balance
ORDER  BY TotalShippedOrders DESC; 

我尝试左连接地址表,但它通过了 TotalShippedOrders 计数。

SELECT ( CASE
       WHEN u.password IS NULL THEN 'GUEST'
       ELSE 'CUSTOMER'
     END )                                 AS STATUS,
   u.date_created                          AS DateCreated,
   u.NAME                                  AS UserName,
   u.password                              AS Password,
   u.email                                 AS Email,
   r.token                                 AS Currency,
   Cast(u.balance / 100 AS DECIMAL(10, 2)) AS Balance,
   Count(o.user_id)                        AS TotalShippedOrders, 
   a.*
FROM   [db].[user] u
   INNER JOIN [db].[region] r
           ON r.currency_id = u.balance_currency
   LEFT JOIN [db].[order] o
          ON o.user_id = u.id
             AND o.status = 'shipped'
   LEFT JOIN [db].[address] a
          ON a.user_id = u.id
 GROUP  BY u.id,
      u.date_created,
      u.NAME,
      u.password,
      u.email,
      r.token,
      u.balance
ORDER  BY TotalShippedOrders DESC; 

有人可以为我指明如何制定这部分查询的方向吗?谢谢!

编辑:我将 DISTINCT 添加到计数中,这似乎解决了问题,但我认为它尚未返回所有用户/地址组合。这个简单的查询返回的行比上面的多:

select * from [db].[user] u
LEFT JOIN [db].[address] a ON a.user_id = u.id 
order by u.id

我希望看到每一行都有用户信息和一个地址。如果一个用户有多个地址,它将有那么多行具有相同的用户信息但不同的地址。有些用户没有地址,这就是为什么我做了一个 LEFT JOIN。

有人能指出我的查询逻辑哪里出错了吗?谢谢!

【问题讨论】:

也许将 Count(o.user_id) 替换为 Count(distinct o.user_id) 【参考方案1】:

您的问题表明每个用户有多个地址。也许您只需要一个地址,例如最近的地址。如果是这样,这样的事情应该可以工作:

SELECT . . .
FROM [db].[user] u INNER JOIN
     [db].[region] r
     ON r.currency_id = u.balance_currency LEFT JOIN
     [db].[order] o
     ON o.user_id = u.id AND o.status = 'shipped' LEFT JOIN
     (SELECT a.*,
             ROW_NUMBER() OVER (PARTITION BY a.user_id ORDER BY a.id DESC) as seqnum
      FROM [db].[address] a
     ) a
     ON a.user_id = u.id AND a.seqnum = 1
. . .

它使用地址表中id最大的地址。

编辑:

如果你需要所有地址,那么你需要在聚合之后做join:

with t as (
      <your query here with "u.id as user_id" in the select
     )
select t.*, a.*
from t left join
     addresses a
     on t.user_id = a.user_id;

【讨论】:

我需要所有地址。请参阅上面的编辑并感谢您的输入! 非常感谢!为什么需要在聚合函数之后进行join?第二个左连接对聚合函数做了什么?

以上是关于需要获取用户的所有地址。已有查询,但无法正确留下连接地址的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu查不到eth 0的IP地址了

使用dhcp可以获得正确的IP和DNS地址,但是无法上网,nslookup无法找到正确的dns服务器进行解析

C# - 连接到 (RAS) *** 时如何获取 IP 地址

使用 jdbc 获取允许用户使用的所有表

Excel VBA 连接到 MS Access(读/写)到多用户表/查询

如何从firebase获取当前用户地址