0

offer と offer_rows の 1 対多の関係を持つ 2 つのテーブルがあります。

コンテンツ行を含む複数のオファーを取得したいと考えています。それ自体は難しくありません。

 INNER JOIN on offer.offer_id = offer_rows.offer_id

ただし、offer_rows テーブルには、リビジョンと呼ばれるフィールドが含まれており、クエリは常にリビジョン番号が最も大きいすべての行をフェッチする必要があります。これは単一のクエリで可能ですか?

offer_revision という 3 番目のテーブルを追加することで、データベースの設計を変更できることに気付きました。このテーブルを選択条件で結合して、最新のリビジョン番号を取得し、このテーブルを行に接続できます。ただし、これにはかなりのリファクタリングが必要になるため、必要な場合にのみ実行したいと考えています。

また、これを直接クエリで実行したいと思います-ストアドプロシージャはありません。

4

3 に答える 3

2

もちろん可能です:

SELECT o.*, r.revision, r.something_else
FROM offer o,
     offer_rows r
WHERE o.offer_id = r.offer_id
  AND r.revision = (
    SELECT max(revision)
    FROM offer_rows
    WHERE offer_id = o.offer_id
  ) 
于 2012-11-13T10:50:44.040 に答える
1

を使用してoffer_rowsからすべての行を選択し、MAX(revision)次にJOINオファーテーブルを選択できます(ネストされたクエリは必要ありません)。

SELECT *, MAX(revision) as latest_revision
FROM offer_rows or
INNER JOIN offer o USING( offer_id )
GROUP BY offer_id
于 2012-11-13T11:00:29.563 に答える
0

はい、これは単一のクエリで可能です。WHERE句の最高のリビジョンを取得するサブクエリを使用できます。

次の比較を使用して、最新バージョンのエントリを取得しました。

AND `outer`.`version` = (
    SELECT MAX( `inner`.`version` )
    FROM `content` `inner`
    WHERE `inner`.`id` = `outer`.`id`
    AND `inner`.`language` = `outer`.`language`
)
于 2012-11-13T10:48:28.873 に答える