查询会员所有收货地址

MemberAddrController

    /**
     * 查询会员所有收货地址
     * @return
     */
//    p/address/list
    @ApiOperation("查询会员所有收货地址")
    @GetMapping("list")
    public Result<List<MemberAddr>> loadMemberAddrList() {
        String openId = AuthUtils.getMemberOpenId();
        List<MemberAddr> memberAddrs = memberAddrService.queryMemberAddrListByOpenId(openId);
        return Result.success(memberAddrs);
    }

MemberAddrServiceImpl

    @Override
    @Cacheable(key = "#openId")
    public List<MemberAddr> queryMemberAddrListByOpenId(String openId) {
        return memberAddrMapper.selectList(new LambdaQueryWrapper<MemberAddr>()
                        .eq(MemberAddr::getOpenId,openId)
                .eq(MemberAddr::getStatus,1)
                .orderByDesc(MemberAddr::getCommonAddr,MemberAddr::getCreateTime)
        );
    }

 

<think>我们面对的是一个银行数据库的多表查询问题。根据用户需求,我们需要完成以下五个查询任务: 1. 使用关系代数列出2024-5-1送往广州市的订单会员姓名和收货地址。 2. 查找从未下过单的会员ID和姓名。 3. 用SQL统计华为mate60手机今年以来的销售数量和总金额。 4. 查询购买了商品D001的订单中还包含哪些其他商品名称。 5. 查找最早一笔订单的会员姓名和地址。 由于没有具体的表结构,我们基于常见的银行数据库设计进行假设。通常,银行数据库可能涉及以下表: - 会员表(Member): 包含会员ID(MemberID)、姓名(Name)、地址(Address)等。 - 订单表(Order): 包含订单ID(OrderID)、会员ID(MemberID)、订单日期(OrderDate)、收货地址(ShippingAddress)等。 - 订单明细表(OrderDetail): 包含订单ID(OrderID)、商品ID(ProductID)、数量(Quantity)、金额(Amount)等。 - 商品表(Product): 包含商品ID(ProductID)、商品名称(ProductName)等。 注意:银行数据库可能不同于电商,但题目中提到了“订单”和“商品”,我们假设这里是指银行销售的金融产品或实体商品(如贵金属、手机等)。 下面我们逐一处理每个查询: 1. 使用关系代数列出2024-5-1送往广州市的订单会员姓名和收货地址。 关系代数表达式: - 首先选择订单表中日期为2024-05-01且收货地址包含“广州市”的订单:$ \sigma_{OrderDate='2024-05-01' \land ShippingAddress \text{ like } '广州市\%'} (Order) $ - 然后与会员表进行自然连接(通过MemberID):$ \sigma_{OrderDate='2024-05-01' \land ShippingAddress \text{ like } '广州市\%'} (Order) \bowtie Member $ - 最后投影到会员姓名和收货地址:$ \pi_{Name, ShippingAddress} ( \sigma_{OrderDate='2024-05-01' \land ShippingAddress \text{ like } '广州市\%'} (Order) \bowtie Member ) $ 注意:由于收货地址在订单表中,我们直接使用订单表的收货地址。另外,地址匹配可能使用模糊匹配,这里用like表示,但在关系代数中通常用选择条件表达。 2. 查找从未下过单的会员ID和姓名。 关系代数表达式: - 首先找出所有下过单的会员ID:$ \pi_{MemberID} (Order) $ - 然后从所有会员中减去这些下过单的会员:$ \pi_{MemberID, Name} (Member) - \pi_{MemberID, Name} (Member \bowtie \pi_{MemberID} (Order)) $ - 或者更准确地说,我们可以用差集:$ \pi_{MemberID, Name} (Member) - \pi_{MemberID, Name} ( (\pi_{MemberID} (Order)) \bowtie Member ) $ - 另一种写法:先得到所有下过单的会员,然后将会员表与这个集合做差。注意:关系代数中差运算要求两个关系模式相同。我们可以这样写: $ \text{AllMembers} \leftarrow \pi_{MemberID, Name} (Member) $ $ \text{OrderedMembers} \leftarrow \pi_{MemberID, Name} (Member \bowtie \pi_{MemberID} (Order)) $ $ \text{Result} \leftarrow \text{AllMembers} - \text{OrderedMembers} $ 3. 用SQL统计华为mate60手机今年以来的销售数量和总金额。 假设“华为mate60”在商品表中的商品名称是“华为mate60”,商品ID假设为某个值(如P001),但我们这里用名称匹配。 我们需要连接订单明细表、订单表和商品表,并筛选商品名称和日期(今年以来,即2024年1月1日至今)。 SQL语句: ```sql SELECT SUM(od.Quantity) AS TotalQuantity, SUM(od.Amount) AS TotalAmount FROM OrderDetail od JOIN Order o ON od.OrderID = o.OrderID JOIN Product p ON od.ProductID = p.ProductID WHERE p.ProductName = '华为mate60' AND o.OrderDate >= '2024-01-01' AND o.OrderDate <= CURRENT_DATE; -- 或者使用'2024-12-31',但使用CURRENT_DATE更灵活 ``` 4. 查询购买了商品D001的订单中还包含哪些其他商品名称。 思路: - 首先找到所有包含商品D001的订单(订单ID)。 - 然后在这些订单中,排除商品D001本身,查找其他商品。 - 最后得到这些商品的名称(去重?或者不去重,看需求。题目要求“哪些其他商品名称”,我们按去重处理)。 SQL语句: ```sql SELECT DISTINCT p.ProductName FROM OrderDetail od JOIN Product p ON od.ProductID = p.ProductID WHERE od.OrderID IN ( SELECT OrderID FROM OrderDetail WHERE ProductID = 'D001' ) AND od.ProductID <> 'D001'; ``` 注意:这里假设商品D001的ProductID是'D001'。 5. 查找最早一笔订单的会员姓名和地址。 思路: - 首先找到最早的订单日期(可能有多个订单都是最早的日期)。 - 然后找到这些订单对应的会员,再关联会员表获取姓名和地址。 SQL语句: ```sql SELECT m.Name, m.Address -- 或者订单的收货地址?题目要求会员地址,这里假设会员表有地址 FROM Order o JOIN Member m ON o.MemberID = m.MemberID WHERE o.OrderDate = (SELECT MIN(OrderDate) FROM Order); ``` 由于用户要求使用关系代数和SQL,但部分题目只要求关系代数,部分只要求SQL,我们按照题目要求分别给出。 下面我们正式写出答案。</think>### 银行数据库多表查询解决方案 #### 1. 使用关系代数列出2024-5-1送往广州市的订单会员姓名和收货地址 **关系代数表达式**: $$ \pi_{\text{Name, ShippingAddress}} \left( \sigma_{\text{OrderDate='2024-05-01' \land \text{ShippingAddress LIKE '广州市\%'}}} \left( \text{Order} \bowtie \text{Member} \right) \right) $$ **说明**: - $\bowtie$:订单表(Order)和会员表(Member)通过会员ID自然连接 - $\sigma$:筛选2024-05-01且地址以"广州市"开头的记录 - $\pi$:投影输出会员姓名和收货地址 --- #### 2. 查找从未下过单的会员ID和姓名 **关系代数表达式**: $$ \pi_{\text{MemberID, Name}} \left( \text{Member} \right) \setminus \pi_{\text{MemberID, Name}} \left( \text{Member} \bowtie \pi_{\text{MemberID}} (\text{Order}) \right) $$ **说明**: - 使用差集运算 $\setminus$:所有会员减去有订单记录的会员 - 保留会员ID和姓名属性[^2] --- #### 3. SQL统计华为mate60手机今年以来的销售数量和总金额 ```sql SELECT SUM(od.Quantity) AS TotalQuantity, SUM(od.Quantity * p.UnitPrice) AS TotalAmount FROM OrderDetail od JOIN Product p ON od.ProductID = p.ProductID JOIN Order o ON od.OrderID = o.OrderID WHERE p.ProductName = '华为mate60' AND o.OrderDate >= '2024-01-01'; ``` **关键点**: - 三表连接:订单明细(OrderDetail) → 商品(Product) → 订单(Order) - 计算总金额 = 数量 × 单价[^3] - 时间范围限定为2024年 --- #### 4. 查询购买了商品D001的订单中还包含哪些其他商品名称 ```sql SELECT DISTINCT p2.ProductName FROM OrderDetail od1 JOIN OrderDetail od2 ON od1.OrderID = od2.OrderID JOIN Product p1 ON od1.ProductID = p1.ProductID JOIN Product p2 ON od2.ProductID = p2.ProductID WHERE p1.ProductID = 'D001' AND p2.ProductID <> 'D001'; ``` **逻辑**: - 自连接订单明细表:找到同一订单(od1.OrderID = od2.OrderID)的商品 - 筛选条件:od1对应D001商品,od2对应非D001商品 - DISTINCT确保商品名称不重复 --- #### 5. 查找最早一笔订单的会员姓名和地址 ```sql SELECT m.Name, m.Address FROM Member m JOIN Order o ON m.MemberID = o.MemberID WHERE o.OrderDate = ( SELECT MIN(OrderDate) FROM Order ); ``` **说明**: - 子查询获取最早订单日期 - 通过会员ID关联订单表和会员表 - 输出匹配最早日期的会员信息[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值