0

さて、オンラインで機能している小さな通信社用の、テーブルと列のレイアウトがあまり良くないデータベースがあります。現在、レイアウトを変更することはできません。だから、私はクエリに集中しています。

Web ページには、「ゲスト」作成者のリストが必要です。各リスト項目には次が含まれている必要があります。

  • 作者イメージ(作者)
  • 著者名 (Authors)
  • 彼/彼女が最後に書いた記事のタイトル (ニュース)
  • その記事のURI(ニュース)

括弧内は、情報が格納されているテーブル名です。

「作成者」(40 件以上のレコード) では、関連する列は次のとおりです。

  • 画像
  • 名前
  • タイプ (ここでは「Guest」という値を探します)
  • ASCII (「名前」の値は格納されますが、英語以外の文字とスペースは含まれません)

「ニュース」(28,000 件以上のレコード) テーブルは、基本的に、すべてのニュースと記事が注ぎ込まれるプールです。関心のある列は次のようになります。

  • Id (主キー: 高いほど新しい)
  • カテゴリー
  • 題名
  • URI

さて、「Category」にはたくさんの値があります。ただし、特定のレコードが記事の場合、この列には「作成者」の「ASCII」が保持されます (悲しいことに、「ID」ではなく)。

各作成者のクエリを "while" する PHP コードがありました。見た瞬間交換したくなりました。それで、「うーん…どうやって一気に取り込めるの?」と思いました。そしてこれを思いついた:

-- Aliases are prefixed with 't' for tables and 'c' for columns.
SELECT
  tAu.Image, tAu.Name, tNw.Title, tNw.URI
FROM ( -- tAu & tNw

    SELECT * FROM ( -- tRc & Authors

        SELECT
          MAX(Id) cId, Category cCt -- Max Id for most recent
        FROM
          News
        GROUP BY
          cCt

    ) tRc -- table of categories with their most recent id's
    INNER JOIN
      Authors
    ON
      tRc.cCt = Authors.ASCII
    WHERE
      Authors.Type = 'Guest'

) tAu -- table of authors with their most recent id's
INNER JOIN
  News tNw
ON
  tAu.cId = tNw.Id -- merging authors with their latest article info

現在、このクエリには約 0.0364 秒かかります。それほど悪くはないかもしれません。しかし、これを改善できるかどうか興味があります (このクエリは News から 2 回選択するため)。

4

1 に答える 1

0

高速かどうかはわかりませんが、クエリを少しクリーンアップしました。これにより、オプティマイザーが役立つ場合があります。

SELECT
  Authors.Image,
  Authors.Name,
  News.Title,
  News.URI

FROM (
    SELECT
      MAX(Id) TopNewsId,
      Category
    FROM News
    GROUP BY Category
) TopNewsPerCats

INNER JOIN News     ON News.Id       = TopNewsPerCats.TopNewsId

INNER JOIN Authors  ON Authors.ASCII = TopNewsPerCats.Category
                   AND Authors.Type  = 'Guest'

News( Category, Id)テーブルには、内部を高速化するためにで始まるインデックスが必要SELECT GROUP BYです。

于 2012-08-29T20:31:31.867 に答える