所以我有两张这样的表:
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)
答案 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