LeetCode - #183 Swift 实现查询未下订单的客户

打印 上一主题 下一主题

主题 1069|帖子 1069|积分 3207



      网罗开发   (小红书、快手、视频号同名)   
    大家好,我是 展菲,现在在上市企业从事人工智能项目研发管理工作,寻常热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享高朋
科技博主:极星会首批签约作者


  
择要

在数据处置惩罚中,常常必要从关联表中筛选出符合条件的数据。本篇文章以“找出从未下订单的客户”为例,联合 SQL 查询和 Swift 编程,提供完备的解决方案。文章内容包括题解答案、代码分析、示例测试及结果展示,帮助开发者快速掌握此类问题的解决思绪。

描述

问题配景

我们有两张表:

  • Customers 表: 包罗客户的 ID 和姓名。
  • Orders 表: 包罗订单的 ID 和关联的客户 ID。
任务是找出所有从未下过订单的客户,即那些在 Orders 表中没有任何记录的客户。
输入输出示例

输入:
Customers 表:
  1. +----+-------+
  2. | id | name  |
  3. +----+-------+
  4. | 1  | Joe   |
  5. | 2  | Henry |
  6. | 3  | Sam   |
  7. | 4  | Max   |
  8. +----+-------+
复制代码
Orders 表:
  1. +----+------------+
  2. | id | customerId |
  3. +----+------------+
  4. | 1  | 3          |
  5. | 2  | 1          |
  6. +----+------------+
复制代码
输出:
  1. +-----------+
  2. | Customers |
  3. +-----------+
  4. | Henry     |
  5. | Max       |
  6. +-----------+
复制代码
解释: Henry 和 Max 的 id 在 Orders 表中不存在,因此他们是未下订单的客户。

SQL 解法

可以利用 LEFT JOIN 和 WHERE 条件来查找未下订单的客户。
SQL 查询如下:
  1. SELECT C.name AS Customers
  2. FROM Customers C
  3. LEFT JOIN Orders O ON C.id = O.customerId
  4. WHERE O.customerId IS NULL;
复制代码
Swift 题解代码

以下是基于 Swift 的完备实现,利用 SQLite 数据库来存储和查询数据:
  1. import SQLite3
  2. func findCustomersWithoutOrders(databasePath: String) -> [String] {
  3.     var db: OpaquePointer?
  4.     var stmt: OpaquePointer?
  5.     var results: [String] = []
  6.     // 打开数据库连接
  7.     if sqlite3_open(databasePath, &db) == SQLITE_OK {
  8.         let query = """
  9.         SELECT C.name AS Customers
  10.         FROM Customers C
  11.         LEFT JOIN Orders O ON C.id = O.customerId
  12.         WHERE O.customerId IS NULL;
  13.         """
  14.         
  15.         // 准备 SQL 查询
  16.         if sqlite3_prepare_v2(db, query, -1, &stmt, nil) == SQLITE_OK {
  17.             // 执行查询并获取结果
  18.             while sqlite3_step(stmt) == SQLITE_ROW {
  19.                 if let cString = sqlite3_column_text(stmt, 0) {
  20.                     let customerName = String(cString: cString)
  21.                     results.append(customerName)
  22.                 }
  23.             }
  24.         } else {
  25.             print("SQL Error: \(String(cString: sqlite3_errmsg(db)))")
  26.         }
  27.         
  28.         // 清理资源
  29.         sqlite3_finalize(stmt)
  30.     }
  31.     sqlite3_close(db)
  32.     return results
  33. }
  34. // 示例测试
  35. let databasePath = "path_to_your_database.sqlite"
  36. let customersWithoutOrders = findCustomersWithoutOrders(databasePath: databasePath)
  37. print("Customers without orders: \(customersWithoutOrders)")
复制代码
Swift 题解代码分析

SQL 查询逻辑


  • LEFT JOIN 操纵:

    • 将 Customers 表和 Orders 表通过 id 和 customerId 举行左连接。
    • 对每个客户,若没有匹配的订单记录,则 O.customerId 为 NULL。

  • WHERE 条件:

    • 筛选出 O.customerId IS NULL 的记录,即未下订单的客户。

  • 结果返回:

    • 只返回符合条件客户的姓名。

Swift 实现分析


  • 数据库连接:

    • 利用 sqlite3_open 连接 SQLite 数据库。

  • 查询执行:

    • 利用 sqlite3_prepare_v2 准备 SQL 查询。
    • 遍历结果集,将每个未下订单客户的姓名添加到数组中。

  • 结果输出:

    • 返回未下订单客户的姓名数组。

示例测试及结果

测试 1

数据库内容:
Customers 表:
  1. +----+-------+
  2. | id | name  |
  3. +----+-------+
  4. | 1  | Joe   |
  5. | 2  | Henry |
  6. | 3  | Sam   |
  7. | 4  | Max   |
  8. +----+-------+
复制代码
Orders 表:
  1. +----+------------+
  2. | id | customerId |
  3. +----+------------+
  4. | 1  | 3          |
  5. | 2  | 1          |
  6. +----+------------+
复制代码
运行代码:
  1. let customersWithoutOrders = findCustomersWithoutOrders(databasePath: databasePath)
  2. print("Customers without orders: \(customersWithoutOrders)")
复制代码
输出结果:
  1. Customers without orders: ["Henry", "Max"]
复制代码
时间复杂度

SQL 查询


  • 连接操纵:

    • 时间复杂度为 (O(n \cdot m)),其中 (n) 是 Customers 表的记录数,(m) 是 Orders 表的记录数。

  • 过滤条件:

    • 遍历每个记录的复杂度为 (O(n))。

总时间复杂度: (O(n \cdot m))。
空间复杂度


  • 查询结果存储:

    • 空间复杂度为 (O(k)),其中 (k) 是未下订单客户的数目。

总空间复杂度: (O(k))。
总结

通过 SQL 和 Swift 的联合,我们乐成实现了查询未下订单客户的功能。本文提供了完备的代码、详细的分析和测试结果,适合开发者学习和借鉴。此方法具有通用性,可扩展到其他雷同的关联查询需求。在实践中,可以通过索引优化 Orders 表的连接键 customerId 进步查询性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表