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