【问题标题】:MySQL INNER JOIN Empty Rows with Subqueries and Max DateMySQL INNER JOIN 带有子查询和最大日期的空行
【发布时间】:2019-02-19 03:28:01
【问题描述】:

我有 3 个通过代码关联的表,像这样

我想通过根据更新注册日期对重复行进行分组来获得我的 3 个相关表的结果。我试过这个加入他们

SELECT
    stu.code,
    stu.name,
    stu.lastname,
    adr.address, 
    adr.phone,
    adr.register_date,
    uni.university,
    uni.degree,
    uni.register_date

FROM student stu

INNER JOIN 
    address adr
    ON adr.code = stu.code

INNER JOIN (
    SELECT code, MAX(register_date) reg_date
    FROM address
    GROUP BY code
) max_address
ON max_address.code = adr.code
AND max_address.reg_date = adr.register_date    

LEFT JOIN
    university uni
    ON uni.code = stu.code

LEFT JOIN (
    SELECT code, MAX(register_date) reg_date
    FROM university
    GROUP BY code
) max_uni
ON max_uni.code = uni.code
AND max_uni.reg_date = uni.register_date

此代码返回...

我只想返回每个学生的最大注册日期(地址和大学表)的行,这将是带有红色箭头的行,即使有些学生在大学表?

如您所见,它发生在“Brandon Walker”中,大学表中没有 854 代码,并且在这些字段中显示 NULL,但没有按 Olivia 和 John 的记录分组,因为我是使用 LEFT JOIN 从 Brandon 带来那些“NULL”记录。

如果我使用INNER JOIN,它根本不会检索 Brandon Walker 寄存器

INNER JOIN
    university uni
    ON uni.code = stu.code

INNER JOIN (
    SELECT code, MAX(register_date) reg_date
    FROM university
    GROUP BY code
) max_uni
ON max_uni.code = uni.code
AND max_uni.reg_date = uni.register_date

更具体地说,我想在我的查询中返回这个

关于如何实现这一点的任何建议?

【问题讨论】:

标签: mysql subquery left-join inner-join


【解决方案1】:

当您在找到特定学生的MAX() 值后需要保留行关联时,GROUP BY 并不是很有帮助。

由于学生表包含唯一的学生代码,因此我在逻辑上想到的是选择学生数据,然后对 addressuniversity 表执行子查询,以隔离具有最新 register_date 之前的单行LEFT JOINing(这将允许将null 行附加)到student 表。

SQL (Demo)

SELECT
    a.code,
    a.name,
    a.lastname,
    b.address,
    b.phone,
    b.register_date AS addr_date,
    c.university,
    c.degree,
    c.register_date AS uni_date
FROM student a
LEFT JOIN (
  SELECT code, address, phone, register_date
  FROM address sub_b
  WHERE register_date = (
      SELECT MAX(register_date)
      FROM address
      WHERE code = sub_b.code
  )) b ON a.code = b.code
LEFT JOIN (
  SELECT code, university, degree, register_date
  FROM university sub_c
  WHERE register_date = (
      SELECT MAX(register_date)
      FROM university
      WHERE code = sub_c.code
  )) c ON a.code = c.code
ORDER BY a.code

输出:

| code | name    | lastname | address | phone | addr_date           | university | degree | uni_date            |
| ---- | ------- | -------- | ------- | ----- | ------------------- | ---------- | ------ | ------------------- |
| 853  | John    | White    | craFtur | 315   | 2016-10-10 07:00:01 | Bristol    | 145    | 2011-02-19 00:00:00 |
| 854  | Brandon | Walker   | cra 101 | 313   | 2005-11-04 06:00:00 | NULL       | NULL   | NULL                |
| 855  | Olivia  | Wright   | cll 26D | 310   | 2012-05-06 07:00:00 | Stanford   | 10025  | 2010-01-07 00:00:00 |

【讨论】:

  • @Fred 我为您发布我的解决方案花费的时间超出了必要的时间,因为我必须手动输入表模式。模式的图像总比没有好,但肯定不如拥有可复制的模式 text 有用。更好的是问你的问题并提供一个预制的 DB-Fiddle 演示链接。这使志愿者可以立即着手研究经过验证的解决方案。当您这样做时,您一定会得到更好、更快和更多的支持。如果我的解决方案不能完美满足您的需求,我很乐意进行调整。
  • 我知道评论部分不应该用来感谢,但这是一个非常好的答案,下一个问题我会按照你对 DB-Fiddle 的建议,再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多