Найти из таблицы базы данных на основе значения поля другой таблицы? - PullRequest
0 голосов
/ 28 июля 2011

У меня есть две таблицы базы данных: таблица 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'.

Как изменить указанный выше запрос, чтобы выбрать страницы (с последним заголовком), а затем отфильтровать эти результаты?

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

( В этом ответе я проведу рефакторинг запроса, чтобы вообще избежать этой проблемы. )

Вместо этого можно использовать коррелированный подзапрос в 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>
0 голосов
/ 28 июля 2011

( Я отвечу на идею этого вопроса; ссылаюсь на сложные вычисления в предложении WHERE из операторов SELECT. Я не буду рефакторизовать запрос, даже если бы это было возможно в реальном сценарии. )

Если вы хотите использовать значение из коррелированного подзапроса, вы можете заключить весь запрос в другой запрос ...
(Обратите внимание, большинство omptimisers поймут это и не будут тратить время на бессмысленные результаты.)

SELECT
  *
FROM
(
  your-query
)
  AS data
WHERE
  <conditions>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...