0

最も内側の結果の最新バージョンのみを返す必要があるという制約により、複数の値を返す必要があるサブクエリを内部結合に変換するのに多くの問題があります。さまざまな回答を検索して閲覧しようとしましたが、修正が見つかりません。以下は少し単純化されていますが、私が望むものを示しており、まったく機能しません:

select 
  works.id as w_id,works.name as w_name,author,publisher,
  (select name as auth from creators where author=id),
  (select name as pub from creators where publisher=id),
  (select version,
    (select pages,uploaded,uri from info where id=workupdates.info)
  from workupdates where work=works.id order by date desc limit 1)
from works

(情報はリビジョン間で変更されないことがよくありますが、ほとんどのドキュメントには少なくともいくつかあります。) 列ごとに 1 つずつ、複数のサブクエリを使用できますが、それは遅くてばかげています。

素朴に、私はそれを次のように翻訳しました:

select
  works.id as w_id,works.name as w_name,developer,publisher,
  (select name as dev from creators where developer=id),
  (select name as pub from creators where publisher=id),
  version,pages,uploaded,uri
from
  works
  left join workupdates on workupdates.work = works.id
  left join info on info.id=workupdates.info

しかし、明らかに、各作業の最新の情報データのみが必要な場合、一致する各情報行に対して 1 つずつ、各作業に対して複数の結果が返されます。

次のように始まることを示唆する1つの回答を見ましfrom (select max(date) from workupdates where workupdates.work = works.id) wu inner join worksたが、私の場合、DBクレームworks.idが存在しないという壊れたクエリが表示されました。私は多くの異なるバリエーションを見て試してきました - 私は、これほど多くの同様のクエリがこれほど異なる構造になるとは思いもしませんでした - しかし、私はまだ運がなく、私の脳はかなり混乱しています.

4

2 に答える 2

0

私はあなたがworksupdatesを「支配テーブル」として使用し、残りをそこに添付するかもしれないと思います:

SELECT works.id, title, version, date, pages, uploaded, uri
    FROM workupdates
    JOIN info ON info.id=workupdates.info
    JOIN works ON workupdates.work = works.id
    WHERE workupdates.date =
        (SELECT MAX(date) FROM workupdates WHERE work = works.id)
;

これが最適ではない場合でも、JOINは日付のフィルタリングの前に行われるためです。

または、テーブルを回転させて順法闘争を行うこともできます。

SELECT works.id, title, version, date, pages, uploaded, uri
    FROM works
    JOIN workupdates ON (workupdates.work = works.id
          AND workupdates.date =
              (SELECT MAX(date) FROM workupdates WHERE work = works.id))
    JOIN info ON info.id=workupdates.info
;

worksupdatesとworksに参加するときにイテレーションを保存できるはずですが、現時点では私には届いていません(そして、私は物事を夢見ているかもしれません):-(

于 2012-07-11T07:05:50.167 に答える
0

LEFT JOIN2番目のクエリの最初のクエリを次のクエリに置き換えてみてください。

LEFT JOIN
(
    SELECT aa.*
    FROM workupdates aa
    INNER JOIN 
    (
        SELECT work, MAX(date) AS maxdate
        FROM workupdates
        GROUP BY work
    ) bb ON aa.work = bb.work AND aa.date = bb.maxdate
) b ON works.id = b.work

これにより、各作業IDの最新のworkupdates行のみが結合されます。

于 2012-07-11T06:53:58.227 に答える