0

単一のクエリでこの問題を解決するのに本当に助けが必要です。

私は4つのテーブルを持っています:

[Assets]
[id | serial_number | date_created] (other stuff)

[Parts]
[id | unit_number | date_created] (other stuff)

[Groups]
[id | asset_id | part_id | date_created] (other stuff)

[Activity]
[id | group_id | date_recorded | action_id] (other stuff)

すべてのアセットを選択し、それらの最新のペアリング (グループ) とそのグループ内での最新のアクティビティを見つけるにはどうすればよいですか? 1 つのレコード行。

編集:私が試したこと:

  1. 私はそれを行いましphpたが、それは非常に醜く、3 つの個別のクエリが必要です。

  2. 各テーブルからすべての属性を個別の で選択しましたがSELECT、これは恐ろしい方法だと思います

    SELECT
        *,
        (
            SELECT
                part_id
            FROM
                groups
            ORDER BY
                date_created 
            DESC
            LIMIT 1
        ) AS part_id
    FROM
        assets
    

ネストされた選択を行うだけpart_idですが、9つの属性が必要な場合は、9つのネストされた選択が必要ですが、これは悪い方法ですか?

4

1 に答える 1

0

あなたの質問は次のことを示唆しています:

SELECT *
FROM assets a cross join
     (select *
      from groups
      order by date_created
      limit 1
     ) g

ただし、実際には、あるフィールド(グループID?パートID?)のアセットとグループに参加し、そのフィールドに基づいて最新のレコードを選択することをお勧めします。次のクエリは、パーツが一致するフィールドであると想定してこれを行います。

SELECT *
FROM assets a join
     (select *
      from groups g join
           (select g.part_id, max(date_created) as maxdate
            from groups g
            group by g.part-id
           ) gmax
           on g.part_id = gmax.part_id and
              g.date_created = gmax.maxdate
     ) g
     on a.parts_id = g.parts_id
于 2012-07-24T17:32:38.367 に答える