0

所以我有两个这样的表:

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 字段为空)。

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

有什么方法可以在 SQL 中表达这一点吗?(我使用的是 MySQL 5.5)

4

4 回答 4

3

LEFT JOIN只关心确保返回 in 中的每一行A即使 in 中没有相应的连接行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
于 2012-10-03T11:00:01.127 回答
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
于 2012-10-03T10:58:59.870 回答
2

您首先需要ttableB子查询中获取最新信息,然后将其与 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
于 2012-10-03T10:59:01.440 回答
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
于 2012-10-03T11:00:01.880 回答