好的,我们有一个数据库,有一个不太好的表格 - 列布局,适用于在线运作的小型新闻机构。目前,改变布局是不可能的;所以,我专注于查询。
网页需要“访客”作者列表。每个列表项应包含:
在括号中是存储信息的表名。
在“作者”(40多条记录)中,相关栏目是:
“新闻”(28k +记录)表基本上是一个所有新闻和文章都涌入的池。感兴趣的列将是:
现在,“类别”有很多值;但是,如果特定记录是文章,则此列保留“作者”的“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秒。可能不是那么糟糕;但是,我很好奇这是否可以做得更好(因为这个查询从新闻中选择两次)。
答案 0 :(得分: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
。