0

したがって、次のような2つのテーブルがあります。

create table A
{
    id int;
    ...
}

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

A は B と 1 対多

したい:

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

しかし、最新の t フィールド (または B エントリがない場合は Bs フィールドの場合は null) を持つ B を持つ A の各エントリに対して正確に 1 行を返したいと考えています。

つまり、すべての AB ペアを返すのではなく、A (または B エントリがない場合は A-null) に関して最新のもののみを選択します。

これをSQLで表現する方法はありますか?(MySQL 5.5 を使用しています)

4

4 に答える 4

3

LEFT JOINに対応する結合行がない場合でも、のすべての行が返されるようにすることだけに関係します。AB

の必要性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)

もう1つは...

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

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
于 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 に答える