需要获取用户的所有地址。已有查询,但无法正确留下连接地址
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?第二个左连接对聚合函数做了什么?以上是关于需要获取用户的所有地址。已有查询,但无法正确留下连接地址的主要内容,如果未能解决你的问题,请参考以下文章
使用dhcp可以获得正确的IP和DNS地址,但是无法上网,nslookup无法找到正确的dns服务器进行解析
C# - 连接到 (RAS) *** 时如何获取 IP 地址