【问题标题】:how to join two tables using group by order by and limit如何使用 group by order by 和 limit 连接两个表
【发布时间】:2014-08-13 06:35:35
【问题描述】:

我有两张桌子

tblXYZ

patId | Name |  DOB
---------------------------
 1    | xyz  |  10-05-1986
 2    | abc  |   12-06-01978
 3    | lmn  |   12-04-1975

tblABC

apptId | patId | status   | otherinfo
-------------------------------------
  1    |  1    |   single | jmdfh
  2    |  1    |   sds    | dfdf  
  3    |  2    |   fdf    | sdwed  
  4    |  2    |   fdf    | sdwed

我想加入这两个表以获得结果:

结果

patId | apptId | Name   |  DOB
--------------------------------
  1   |   2    | single |  jmdfh
  2   |   4    |  sds   |  dfdf  
  3   |  null  |  fdf   |  sdwed 

apptId 应该是 tblABC 中最后输入的值

【问题讨论】:

  • 您的第一个结果不应该是1 1 single jmdfh 还是1 2 sds dfdf
  • 第二个结果不应该是2 4 fdf sdwed,最后一个是3 null null null吗?
  • 通过结果查询,您是否希望第 3 列和第 4 列分别为 statusotherinfo?我有点困惑,因为数据与名称不匹配。
  • 除了上面别人说的patId 1,patId 3的结果应该如何推导出来?
  • 您的结果看起来完全错误。 DOB怎么可能是jmdfhl。第三行应该是 3, null, null, null 或 3, null, lmn, 12-04-1975。请更新您的问题,以便更清楚。

标签: mysql sql join


【解决方案1】:

试试类似的方法

select patId, apptId, Name, DOB
join -- or left join if you want patId that doesn't have match in the second table
(
  select patId AS patIdBis, max(apptId) AS apptId 
  from tblABC group by patId
)
on patId = patIdBis
order by patId;

【讨论】:

  • 如果需要从 tblABC 投射除 apptId 以外的任何内容,此查询将不起作用。
  • 但它回答了他的问题。如果问题不同,答案也会不同
  • 这似乎是问题的答案,虽然这个问题很不清楚,这确实是任何人的猜测。
【解决方案2】:

如果“最后输入”是指最大的 apptId,那么下面的查询将执行您想要的操作。

SELECT tblXYZ.patId, tblABC.apptId, tblXYZ.name, tblXYZ.DOB
FROM tblXYZ
     LEFT JOIN
     (
         (SELECT patId, MAX(apptId) mx FROM tblABC GROUP BY patId) maxes
         INNER JOIN tblABC
         ON maxes.patId = tblABC.patId AND maxes.mx = tblABC.apptId
     ) ON tblXYZ.patId = tblABC.patId;

更新:如果您只需要来自 tblABC 的 apptId,Valentin Clement 的查询会更短且更好。如果您需要 tblABC 中的任何其他数据,则需要使用我的答案中的查询。

【讨论】:

    【解决方案3】:

    使用此查询获取结果

    SELECT x.patid, a.apptid, x.name, x.dob 
    FROM tblxyz x INNER JOIN tblabc a ON 
    x.patid=a.patid
    

    patid apptid  name  DOB
    1     1       xyz   1986-10-05 00:00:00.000
    1     2       xyz   1986-10-05 00:00:00.000
    2     3       abc   1978-12-06 00:00:00.000
    2     4       abc   1978-12-06 00:00:00.000
    

    【讨论】:

    • 建议您编辑您的帖子,以便出现在代码块中。这很难阅读,但似乎也缺少任何最大值。
    猜你喜欢
    • 2023-03-16
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多