【问题标题】:Selecting a Single Row from Joined Table从连接表中选择单行
【发布时间】:2021-10-18 22:03:31
【问题描述】:

我有两张表,PersonAddress,如下图:

人物

地址

使用这些表,我想创建一个视图,在 Person 表中为每个人创建一行,但只需要获取最近的地址(即 max address_id),如下所示(例如 Jane's地址应在视图中设置为“20 Main St”):

使用下面的脚本,表格似乎按预期加入,但我在 address 字段中看不到任何值。我尝试了同一个脚本的几种不同变体,但此时我几乎在旋转。

任何提示将不胜感激!

SELECT
  p.person_id AS id,
  p.first_name AS first_name,
  p.last_name AS last_name,
  a.address AS address
FROM Person p
LEFT JOIN Address a ON
  a.address_id = (
    SELECT MAX(address_id)
    FROM Address
    WHERE p.person_id = a.person_id
  )

【问题讨论】:

  • use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。 How to Ask Help center 代码 sn-ps 用于 HTML/CSS/Javascript,使用代码块,请参阅编辑帮助。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以提供的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个出乎意料的结果时,暂停你的总体目标,切到第一个有意外结果的子表达式,说出你的预期和原因,并由文档证明。
  • 当被minimal reproducible example 锁定并明确描述时,这将是一个常见问题。请在考虑发布之前阅读手册和谷歌任何错误消息和许多清晰、简洁和准确的问题/问题/目标的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。反映你的研究。 PS LEFT JOIN 返回由 NULL 扩展的 INNER JOIN 行 UNION ALL 不匹配的左表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。
  • 你的 MySql 版本是多少?
  • @Stu - 现在是 10.5.10

标签: mysql left-join


【解决方案1】:

我已经测试了这个查询,它满足你的需要。

select p.id, p.name, a.address
from person p
         left join address a 
             on p.id = a.person_id 
             and a.id = (select max(id) from address where person_id = p.id)
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多