SQL LEFT JOIN只有最新的右列条目?

时间:2012-10-03 10:54:16

标签: mysql sql

所以我有两张这样的表:

create table A
{
    id int;
    ...
}

create table B
{
    id int;
    a_id int;
    t timestamp;
    ...
}

A是一对多的B

我想:

SELECT * FROM A LEFT JOIN B ON A.id = B.a_id ???

但是我想为A中的每个条目返回一行,其中B具有最新的t字段(如果没有B条目,则为Bs字段为null)。

那不是返回所有的A-B对,我只想选择最新的A对(如果没有B条目则选择A-null)。

有没有办法在SQL中表达这个? (我正在使用MySQL 5.5)

4 个答案:

答案 0 :(得分:3)

LEFT JOIN 关注确保A中的每一行都被返回,即使B中没有相应的连接行。

just one row的需要需要另一个条件。 MySQL的选项受到限制,但可能是:

SELECT
  *
FROM
  A
LEFT JOIN
  B
    ON  B.id = A.id
    AND B.t = (SELECT MAX(lookup.t) FROM B AS lookup WHERE lookup.id = A.id)

另一个可能是......

SELECT
  *
FROM
  A
LEFT JOIN
(
  SELECT id, MAX(t) AS t FROM B GROUP BY id
)
  AS lookup
    ON lookup.id = A.id
LEFT JOIN
  B
    ON  B.id = lookup.id
    AND B.t  = lookup.t

答案 1 :(得分:2)

您可以执行以下操作:

SELECT A.*, B.*
FROM 
    A
    LEFT JOIN 
    (SELECT B.a_id, MAX(t) as t FROM B GROUP BY B.a_id) BMax
    ON A.id = BMax.a_id
    JOIN B
    ON B.a_id = BMax.a_id AND B.t = BMax.t

答案 2 :(得分:2)

首先需要在子查询中从t获取最新的tableB,然后将其与tableA和tableB一起加入。

SELECT  a.*, c.*
FROM    tableA a
        LEFT JOIN
        (
            SELECT a_ID, max(t) maxT
            FROM tableB
            GROUP BY a_ID
        ) b on a.a_id = b.a_ID
        LEFT JOIN tableB c
            ON b.a_ID = c.a_ID AND
                b.maxT = c.t

答案 3 :(得分:1)

试试这个:

SELECT * 
FROM tableA A LEFT JOIN 
     (select a_id ,max(t) as max_t
      from tableB
      group by a_id )b
on  A.id = b.a_id
and A.t=b.max_t
相关问题