选择Max From 2 Tables Joined

时间:2018-01-22 09:41:15

标签: mysql sql

我使用mysql作为dbms,并且在尝试仅显示来自2个表的最新数据时遇到问题。 我有tbl_A

wid       date            val
-----------------------------
atjeh     11 Jan 2018     230
banda     22 Jan 2018     113
atjeh     20 Jan 2018     266
cirebon   21 Jan 2018     130
cirebon   09 Jan 2018     144

我有tbl_B

lid       wid
-------------
5500      atjeh
5501      cirebon
5502      banda

我想像这样加入这些表:

wid          lid          date          val
-------------------------------------------
atjeh        5500        20 Jan 2018    266
banda        5502        22 Jan 2018    133
cirebon      5501        21 Jan 2018    130

我试过这个:

SELECT tbl_A.wid, tbl_B.lid, MAX(tbl_A.date), tbl_A.val
FROM tbl_A
JOIN tbl_B ON tbl_B.wid = tbl_A.wid
GROUP BY tbl_B.witel

但是输出只选择最新日期:

wid          lid          date          val
-------------------------------------------
atjeh        5500        20 Jan 2018    230 ---> should be 266
banda        5502        22 Jan 2018    133
cirebon      5501        21 Jan 2018    144 ---> should be 130

我该怎么做才能解决这个问题?谢谢。

3 个答案:

答案 0 :(得分:1)

您需要有一个子查询,为每个Date获取最新的wid,然后再次将表连接到自身以获取所需的所有列。

SELECT  b.lid, b.wid,
        a.date, a.val
FROM    tbl_B b
        INNER JOIN tbl_a a
            ON b.wid = a.wid
        INNER JOIN
        (
            SELECT  wid, MAX(Date) AS Date
            FROM    tbl_a a
            GROUp   BY wid
        ) c
            ON c.wid = a.wid
                AND c.Date =  a.Date

这里是Demo

答案 1 :(得分:0)

我已经形成了一个可以解决您问题的查询。而不是使用组函数我使用分析函数来解决这个问题,因为性能会更好。除了将date列更改为col_date之外,我使用了相同的表名和列名。(Oracle不允许我创建名为“date”的列,因为它是关键字)。当您使用此查询时,只需将“col_date”列更改为“date”,即可开始使用。

代码:

    select 
wid,
lid,
col_date,
val from (
SELECT
    tbl_a.wid as wid,
    tbl_b.lid as lid,
    tbl_a.col_date as col_date,
    tbl_a.val val,
    max(tbl_A.col_date) over(partition by tbl_A.wid order by null) as max_date
FROM
     tbl_a
    JOIN  tbl_b ON tbl_b.wid = tbl_a.wid) where max_date=COL_DATE;

希望这有帮助。

由于 ANKIT

答案 2 :(得分:0)

尝试此查询!

SELECT    
              a.wid       AS wid  , 
              b.lid       AS lid  , 
              MAX(a.date) AS date ,
              MAX(a.val)  AS val
    FROM 
              tbl_A  a            ,
              tbl_B  b
    WHERE 
              a.wid = b.wid
    GROUP BY 
              a.wid