1

私は長い間これを理解しようとしてきましたが、あきらめ始めています。

ケースを単純化するために、2 つのテーブルがあるとします。メイン テーブルはarticlesで、私は と一緒に参加していcontractsます。契約テーブルには終了日があります。記事ごとにここから 1 行だけを選択して、最新の contract_to 日付を選択します。

私は何かを試してみましLEFT JOIN contracts ON (contracts.article = articles.id) ORDER BY contract_to DESC LIMIT 1たが、明らかにうまくいきません。

どうすればこれを行うことができますか?

以下の契約表の各行の日付範囲が異なることに注意してください。
また、最新の日付はすべての記事の契約で同じではないため、最新の日付を特定して WHERE 句に貼り付けることはできません。

ここに画像の説明を入力

4

3 に答える 3

3

最新の値を取得するには、集計contract_toが必要です。MAX()これを行う適切な方法は、サブクエリ結合を使用してarticleMAX(contract_to)の値のみを取得し、それを行の残りの値と結合することです。最後に、その構造全体をテーブルに対して結合できarticlesます。

SELECT
  articles.*,
  contracts.*
FROM 
  articles
  /* Join against a subquery which returns only the article and latest contract_to */
  LEFT JOIN (
    SELECT article, MAX(contract_to) AS contract_to
    FROM contracts
    GROUP BY article
  ) maxcontract ON articles.article_id = maxcontract.article
  /* and join that against the rest of the contracts table, on those two column values */
  JOIN contracts 
    ON maxcontract.article = contracts.article
    AND maxcontract.contract_to = contracts.contract_to

MySQL はGROUP BY句の内容に寛大であるため、このメソッドは実際には必要ない場合があり、contractsテーブルに対して個別に結合します。おそらく、サブクエリ結合のみで実行できますが、他のほとんどの RDBMS では機能せず、これはこれは、MySQL の奇妙な動作に依存せずに行うための本当に正しい方法です。

于 2013-08-17T21:25:00.070 に答える
1

MySQL には、一部の DBMS が提供する優れた分析関数がありませんが、次のように記述できます (たとえば)。

SELECT ...
  FROM articles
  LEFT
 OUTER
  JOIN ( SELECT article,
                MAX(contract_to) AS contract_to
           FROM contracts
          GROUP
             BY article
       ) articles_to_max_contracts
    ON articles_to_max_contracts.article = articles.id
  LEFT
 OUTER
  JOIN contracts
    ON contracts.article = articles.id
   AND contracts.contract_to = articles_to_max_contracts.contract_to
;
于 2013-08-17T21:25:16.287 に答える
0

価格だけを取得するには、相関サブクエリを使用してこれを行うこともできます。

select a.*,
       (select price
        from contracts c
        where a.article = c.article
        order by contract_from desc
        limit 1
       ) as lastPrice
from articles a;

これにインデックスを使用すると、contracts(article, contract_from)比較的効率的になります。

于 2013-08-17T22:39:48.843 に答える