SQL 连接:选择一对多关系中的最后一条记录

2024-03-01

假设我有一张客户表和一张采购表。每次购买都属于一位客户。我想获得所有客户的列表以及他们最后一次购买的商品SELECT陈述。最佳实践是什么?关于建立索引有什么建议吗?

请在您的答案中使用这些表/列名称:

  • 顾客:id, name
  • 购买:id, customer_id, item_id, date

在更复杂的情况下,通过将最后一次购买放入客户表来对数据库进行非规范化是否(从性能角度)有益?

如果(购买)id保证按日期排序,可以通过使用类似的东西来简化语句LIMIT 1?


这是一个例子greatest-n-per-groupStackOverflow 上经常出现的问题。

以下是我通常建议解决该问题的方法:

SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND 
    (p1.date < p2.date OR (p1.date = p2.date AND p1.id < p2.id)))
WHERE p2.id IS NULL;

说明:给定一行p1,不应该有行p2与同一客户和较晚的日期(或者在平局的情况下,较晚的日期)id)。当我们发现这是真的时,那么p1是该客户最近一次购买的商品。

关于索引,我会在中创建一个复合索引purchase在列上(customer_id, date, id)。这可能允许使用覆盖索引来完成外连接。请务必在您的平台上进行测试,因为优化取决于实现。使用 RDBMS 的功能来分析优化计划。例如。EXPLAIN在 MySQL 上。


有些人使用子查询而不是我上面展示的解决方案,但我发现我的解决方案可以更轻松地解决关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL 连接:选择一对多关系中的最后一条记录 的相关文章

  • SQLite 自然连接损坏?

    我刚刚开始了解 NATURAL JOIN 而 SQLite 的行为并不像我预期的那样 SELECT FROM r1 NATURAL JOIN r2 NATURAL JOIN r3 and SELECT FROM r1 NATURAL JOI
  • 显示一个表中的所有记录以及另一表中的匹配记录

    您好 我有一张下表 其中记录了活动和积分 Activites A ID Site ActivityValue ActivityName 1 site1 7 ActivityName1 2 site1 6 ActivityName2 2 si
  • db2中如何删除所有非数字字母

    我在 DATA 列 varchar 中有一些数据 如下所示 Nowshak 7 485 m Maja e Korabit Golem Korab 2 764 m Tahat 3 003 m Morro de Moco 2 620 m Cer
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 数据库级别的别名列名 [MySQL]

    别名 可能是错误的词 因为它是在将列 表名称作为查询中的其他名称引用的上下文中使用的 我感兴趣的是是否有一种方法可以在数据库中为列指定两个名称 如果我要打印这样的表格 它看起来会是这样的 mysql gt SELECT FROM User
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 有没有办法在 MySQL 中有效地对 TRUNCATE 或 DROP TABLE 进行 GRANT ?

    我最近在 MySQL 5 5 x 中尝试过 GRANT SELECT INSERT UPDATE DELETE TRUNCATE ON crawler TO my user localhost WITH GRANT OPTION 这会导致错
  • MySQL 最佳实践:SELECT 子递归尽可能提高性能?

    我想选择一个根项目及其子项 使其性能尽可能高 我更喜欢使用嵌套集模型 但这次表结构遵循邻接模型 有关嵌套集和邻接模型的更多信息 http mikehillyer com articles managing hierarchical data
  • 按原样将 SQL 保存到 YAML

    我想以我自己的格式将 SQL 保存到 YAML 文件 如下所示 1 sql SELECT DISTINCT p id product p price AS price sp reduction AS discount FROM 我使用 YA
  • 如何在 SQL Server 中保持数据行内

    我正在尝试找出如何检测数据是否在VARCHAR n SQL Server 2008 中的列存储在行内或行外 有谁知道如何做到这一点 另外 如果我们需要数据 有没有办法将数据保持在行中 要查看某个值是行内还是行外 您可以使用DBCC PAGE
  • 如何根据同一个表中的先前数据更新 SQL 表

    我有一张衡量学生表现的表格student在我的数据库中如下 ID TestDate PerformanceStatus PS 1 15 03 2016 0 1 01 04 2016 2 1 05 05 2016 1 1 07 06 2016
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • 手动更改postgresql中查询的执行计划?

    是否可以在postgresql中手动更改执行计划的操作顺序 例如 如果我总是想在过滤之前进行排序操作 尽管这在 postgresql 的正常使用中没有意义 是否可以通过例如手动强制执行该操作改变运营的内部成本 如果我实现自己的功能呢 是否可
  • Postgresql 串行错误自动增量

    我在 postgresql 上遇到问题 我认为 postgresql 中有一个错误 我错误地实现了一些东西 有一个表包括colmn1 primary key colmn2 unique colmn3 插入一行后 如果我尝试使用现有的另一次插
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • 如何将彼此“接近”的纬度/经度点分组?

    我有一个用户提交的纬度 经度点的数据库 并且正在尝试将 接近 点分组在一起 接近 是相对的 但目前看来约为 500 英尺 起初 我似乎只能按前 3 个小数位具有相同纬度 经度的行进行分组 大约是一个 300x300 的盒子 了解当您远离赤道
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • 合并sql中的列

    我正在使用 SQL Server 2017 有一个存储过程 其中我有一个带有连接的简单选择 例如 SELECT p legacyKey AS JobNumber p Name AS JobName G Label AS DesignStat
  • 如何使用第二行中的值填充第一行中的空值?

    我正在尝试编写一个查询 仅显示每个名称的第一行 但这些行的标题为空 因此我想从紧邻的下一行中提取它们的标题 table1 Name Title Row Dan NULL 1 Dan Engineer 2 Dan Developer 3 Ja

随机推荐

  • 如何以编程方式将单击事件分配给以编程方式创建的项目符号列表?

    我尝试以编程方式编写一个方法并将其分配为 onclick 事件调用的方法 但有些地方不对 该方法未被调用 BulletedList bulletList new BulletedList 我使用将项目添加到项目符号列表中bulletList
  • 为什么我的 ' 字符在发布到我的服务器时变成了 \'?

    我对HTML不是很强 每次都会遇到一些编码问题 在这里 我有一个类似的表格
  • 如何给子类提供静态字段?

    我有一个名为 operation java 的抽象超类和几个扩展该类并表示操作的子类 每个这样的子类应该包含一个规范化内容的数组 该数组应该是静态的 因为它全局保存 我有以下示例 abstract class Operation priva
  • Python继承:将所有参数从基类传递到超类

    我还不太习惯 Python 中的类继承 我想要做的只是在创建超类时将所有参数从基类传递给超类 class A def init self a b self a a self b b def do self c self a self b r
  • HTML 拖放 - 如何设置*传出*拖放(到桌面)的文件名

    我试图让用户可以将图标从网络浏览器拖动到桌面 并创建一个文本文件 我已经记下了内容部分 但我不知道如何设置文件名 我尝试过变异dataTransfer files但这是只读的 我不知道如何实现这一目标 class CrashReport e
  • 在 JMeter 的 BeanShell Sampler 中将字符串解析为整数

    我试图在 JMeter 中将字符串解析为整数 但由于以下错误而失败 如果我尝试打印 vars get 返回的字符串 它们看起来不错 2014 06 28 00 08 52 WARN jmeter assertions BeanShellAs
  • Hibernate:为什么使用或不使用类似天气的字段绑定显式@JoinColum注释?

    Is JoinColum当我们使用任何关联类型注释时隐式指定 例如 OneToOne OneToMany etc 这是摘自Student实体与Laptop实体 情况1 不使用显式 JoinColum OneToMany cascade Ca
  • boost::thread::id 的 tr1::hash 吗?

    我开始使用unordered set类来自tr1命名空间以加速对普通 基于树 STL 的访问map 但是 我想在 boost 中存储对线程 ID 的引用 boost thread id 并意识到这些标识符的 API 非常不透明 以至于您无法
  • 如何锁定和解锁 SQL SERVER 表?

    冒着过度解释我的问题的风险 我会错误地提供太多信息 我正在创建一个批量上传过程 将数据插入两个表中 这两个表大致如下所示 TableA是一个自引用表 允许 N 级引用 Parts self referencing table PartId
  • 语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,期望 T_STRING 或 T_VARIABLE 或 T_NUM_STRING [重复]

    这个问题在这里已经有答案了 我已经盯着这个代码几个小时了 我不知道我的错误在哪里 我知道这种语法错误通常是由于缺少或不合适的大括号或单 双引号的一些问题而出现的 而且我不确定我的代码中是否存在这样的错误 我现在只是想修复我的语法 以便我可以
  • 模板部分专业化 - 有现实世界的例子吗?

    我正在思考partial specialization 虽然我理解这个想法 但我还没有看到这种技术在现实世界中的任何用法 Full specialization被用在很多地方STL所以我对此没有问题 你能告诉我一个现实世界的例子吗 part
  • 在 Mercurial 中进行合并时忽略空格

    在 Mercurial 中进行合并时 我们遇到了一个问题 其中空白更改会导致合并冲突 从而掩盖了我们可能遇到的任何 真实 冲突 并使合并成为一场噩梦 我们最近遵循了一种格式样式 该样式更改了某些分支中文件的缩进 并且从那时起合并几乎变得不可
  • 如何在Java字符类中表示空字符

    我想在 Java 中将空字符表示为 在字符串中 像那样char ch an empty character 其实我想替换一个字符而不留空格 我认为理解这意味着什么就足够了 没有字符 甚至没有空间 您可以分配 u0000 或 0 为此 请使用
  • 使用对话框框架的 primefaces 对话框未弹出

    我正在尝试使用 primefaces 对话框框架来简化我的代码 我已经按照 primefaces 4 0 用户指南中的示例进行操作 但它不起作用 我几乎逐字复制了该示例 创建了三个文件 一个包含对话框的文件 一个调用对话框的文件和一个支持
  • 在 R 中的命名空间中导入有什么好处?

    R 的命名空间机制允许人们export然后对用户可见的功能 此外 它还允许import来自其他包的函数 虽然出口的好处是显而易见的 但我在理解进口的好处时遇到了更多问题 一个好处似乎是 可以使用其他包中的功能 而无需附加包 从而节省内存 这
  • Objective-C/iOS:在后台保持蓝牙连接处于活动状态

    我已经研究了几天了 看起来当手机进入睡眠状态或应用程序在后台时 不可能保持蓝牙连接 然而 我发现一个应用程序声称它们可以一直运行 运行守护者应用程序 http itunes apple com ca app runkeeper id3002
  • jsPDF with Cordova - 添加图像

    我正在尝试使用 jsPDF 库生成 PDF https github com MrRio jsPDF https github com MrRio jsPDF 从移动 Cordova 应用程序中 我目前正在 Android 4 0 4 设备
  • Java反射带参数的私有方法最好的方法是什么?

    我正在尝试使用java反射调用私有方法我开发了一个小方法来调用其他方法迭代所有方法并按名称和参数类型进行比较我已成功调用4个方法 我有一个问题 1 这是最好的方法吗 因为我知道 class getMethod 仅匹配公共方法 Java有内置
  • 停止 ReSharper 添加注释

    我在我的 C 项目中使用 ReSharper 总的来说我很喜欢它 但是 当我执行某些重构操作时 它会不断向代码添加注释 例如 它添加了 NotNull 当我使用 检查参数是否为空 上下文操作时 Before context action p
  • SQL 连接:选择一对多关系中的最后一条记录

    假设我有一张客户表和一张采购表 每次购买都属于一位客户 我想获得所有客户的列表以及他们最后一次购买的商品SELECT陈述 最佳实践是什么 关于建立索引有什么建议吗 请在您的答案中使用这些表 列名称 顾客 id name 购买 id cust