好的,我们有一个数据库,它的表列布局不太好,用于一家在线运作的小型新闻机构。目前无法更改布局;所以,我专注于查询。
网页需要“来宾”作者列表。每个列表项应包含:
- 作者的形象(作者)
- 作者姓名(作者)
- 他/她写的最后一篇文章的标题(新闻)
- 那篇文章的 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 秒。可能没那么糟糕;但是,我很好奇这是否可以做得更好(因为这个查询从新闻中选择了两次)。