我有两个数据库表:一个用于存储页面ID和其他元数据的pages
表,以及一个存储页面标题和内容修订版的pages_revisions
表。
在我的应用程序中,我有一个核心Pages
控制器。我想修改这个控制器,以便它传递一个页面标题,然后控制器返回一个数据库记录,如果一个页面的最新版本标题匹配。
到目前为止,我有这个:
SELECT
id, (
SELECT title
FROM pages_revisions
WHERE page_id = pages.id
ORDER BY created DESC
LIMIT 1
) AS title, (
SELECT content
FROM pages_revisions
WHERE page_id = pages.id
ORDER BY created DESC
LIMIT 1
) AS content
FROM pages
但是使用此查询,我无法使用别名title
列来执行WHERE
查询;例如...WHERE title = 'Home'
。
如何修改上述查询以选择页面(及其最新标题),然后过滤这些结果?
答案 0 :(得分:0)
(我将在这个问题中回答这个想法;从SELECT语句中引用WHERE子句中的复杂计算。我不会重构查询,即使我可能会在现实场景中。 )
如果要使用相关子查询中的值,可以将整个查询包装在另一个查询中...
(注意,大多数omptimiser会理解这一点,而不是浪费时间在毫无意义的结果上。)
SELECT
*
FROM
(
your-query
)
AS data
WHERE
<conditions>
答案 1 :(得分:0)
(在这个答案中,我将重构查询以完全避免这个问题。)
相反,您可以在JOIN中使用相关的子查询来查找所需的记录...
(这假设page_revisions具有它自己的唯一标识符)
SELECT
pages.id,
page_revisions.title,
page_revisions.content
FROM
pages
LEFT JOIN
page_revisions
ON page_revisions.id = (SELECT TOP 1 id FROM page_revisions WHERE page_id = pages.id ORDER BY created DESC)
WHERE
<conditions>