0

好的,我们有一个数据库,它的表列布局不太好,用于一家在线运作的小型新闻机构。目前无法更改布局;所以,我专注于查询。

网页需要“来宾”作者列表。每个列表项应包含:

  • 作者的形象(作者)
  • 作者姓名(作者)
  • 他/她写的最后一篇文章的标题(新闻)
  • 那篇文章的 URI(新闻)

括号中是存储信息的表名。

在“作者”(40+ 条记录)中,相关列是:

  • 图片
  • 姓名
  • 类型(我们将在此处查找值“Guest”)
  • ASCII(存储“名称”值但没有非英文字符和空格)

“新闻”(28k+ 条记录)表基本上是一个所有新闻和文章都涌入的池。感兴趣的列是:

  • id(主键:越高,越近)
  • 类别
  • 标题
  • URI

现在,“类别”有一大堆值;但是,如果特定记录是一篇文章,则此列包含“Authors”的“ASCII”(而不是它的“Id”,遗憾的是)。

有一个 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 秒。可能没那么糟糕;但是,我很好奇这是否可以做得更好(因为这个查询从新闻中选择了两次)。

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 回答