MySQL: просмотр с подзапросом в ограничении предложения FROM - PullRequest
57 голосов
/ 15 октября 2008

В MySQL 5.0 почему возникает следующая ошибка при попытке создать представление с подзапросом в предложении FROM?

ОШИБКА 1349 (HY000): SELECT представления View содержит подзапрос в предложении FROM

Если это ограничение движка MySQL, то почему они еще не реализовали эту функцию?

Кроме того, каковы хорошие обходные пути для этого ограничения?

Существуют ли обходные пути, которые работают для любого подзапроса в предложении FROM, или есть некоторые запросы, которые нельзя выразить без использования подзапроса в предложении FROM?


Пример запроса (был похоронен в комментарии):

SELECT temp.UserName 
FROM (SELECT u1.name as UserName, COUNT(m1.UserFromId) as SentCount 
      FROM Message m1, User u1 
      WHERE u1.uid = m1.UserFromId 
      Group BY u1.name HAVING SentCount > 3 ) as temp

Ответы [ 5 ]

78 голосов
/ 19 августа 2010

У меня была такая же проблема. Я хотел создать представление для отображения информации за последний год из таблицы с записями с 2009 по 2011 год. Вот оригинальный запрос:

SELECT a.* 
FROM a 
JOIN ( 
  SELECT a.alias, MAX(a.year) as max_year 
  FROM a 
  GROUP BY a.alias
) b 
ON a.alias=b.alias and a.year=b.max_year

Схема решения:

  1. создать представление для каждого подзапроса
  2. заменить подзапросы этими представлениями

Вот запрос решения:

CREATE VIEW v_max_year AS 
  SELECT alias, MAX(year) as max_year 
  FROM a 
  GROUP BY a.alias;

CREATE VIEW v_latest_info AS 
  SELECT a.* 
  FROM a 
  JOIN v_max_year b 
  ON a.alias=b.alias and a.year=b.max_year;

Отлично работает на mysql 5.0.45, без большой потери скорости (по сравнению с выполнением исходный подзапрос выбирается без каких-либо представлений).

18 голосов
/ 15 октября 2008

Не удалось написать запрос в вашем комментарии просто как:

SELECT u1.name as UserName from Message m1, User u1 
  WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3

Это также должно помочь с известными проблемами скорости с подзапросами в MySQL

5 голосов
/ 15 октября 2008

Кажется, это известная проблема.

http://dev.mysql.com/doc/refman/5.1/en/unnamed-views.html

http://bugs.mysql.com/bug.php?id=16757

Многие запросы IN могут быть переписаны как (левые внешние) объединения и IS (NOT) NULL некоторого вида. например

SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)

можно переписать как

SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID

или

SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)

может быть

SELECT FOO.* FROM FOO 
LEFT OUTER JOIN FOO2 
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL
4 голосов
/ 27 января 2015

Вы можете обойти эту проблему, создав отдельный VIEW для любого подзапроса, который вы хотите использовать, а затем присоединитесь к нему в создаваемом VIEW. Вот пример: http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

Это очень удобно, так как вы, скорее всего, захотите использовать его в любом случае и поможет сохранить SQL DRY.

4 голосов
/ 12 апреля 2013

создать представление для каждого подзапроса это путь. Получилось работать как шарм.

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