Можно ли «кэшировать» встроенный MySQL select, используемый несколько раз? - PullRequest
0 голосов
/ 20 января 2012

Работая в Drupal 6, PHP 5.3 и MySQL, я создаю запрос, который выглядит примерно так:

SELECT val from table [and some other tables joined in below]
    where [a bunch of clauses, including getting all the tables joined up]
        and ('foo' not in (select ...))
        and (('bar' in (select...) and x = y)
             or ('baz' in (select ...) and p = q))

Это не очень хорошее представление о том, что я пытаюсь сделать, но, надеюсь, этого будет достаточно. Дело в том, что в середине запроса есть встроенный SELECT, который используется несколько раз. Это всегда то же самое. Он не полностью самодостаточен - он опирается на значение, извлеченное из одной из таблиц на верхнем уровне запроса.

Я чувствую себя немного виноватым / нечистым за то, что просто повторяю запрос каждый раз, когда это необходимо, но я не вижу другого способа вычислить значение один раз и использовать его по мере необходимости. Поскольку оно ссылается на значение из таблицы верхнего уровня, я не могу вычислить его один раз вне запроса и просто вставить значение в запрос, либо через переменную MySQL, либо перебирая строку запроса. Или, я так думаю, в любом случае.

Что я могу с этим поделать? Или, может быть, это не проблема с точки зрения производительности: код может быть неприятным, но, возможно, MySQL достаточно умен, чтобы кэшировать само значение и избегать выполнения запроса снова и снова? Любой совет? Спасибо!

1 Ответ

0 голосов
/ 20 января 2012

Вы должны иметь возможность наложить псевдоним на результат, выполнив SELECT ... AS alias, а затем используя in alias в других запросах, поскольку SELECT на самом деле является просто таблицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...