Я конвертирую все свои запросы SQL Server в MySQL, и все мои запросы, содержащиеся WITH
в них, не работают. Вот пример:
WITH t1 AS
(
SELECT article.*, userinfo.*, category.*
FROM question
INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid
INNER JOIN category ON article.article_categoryid = category.catid
WHERE article.article_isdeleted = 0
)
SELECT t1.*
FROM t1
ORDER BY t1.article_date DESC
LIMIT 1, 3
Ответы:
MySQL до версии 8.0 не поддерживает предложение WITH (CTE на языке SQL Server; факторинг подзапроса в Oracle), поэтому вам остается использовать:
Запрос на эту функцию датируется 2006 годом.
Как уже упоминалось, вы предоставили плохой пример - нет необходимости выполнять подвыбор, если вы никоим образом не изменяете вывод столбцов:
Вот лучший пример:
источник
Команда разработчиков Mysql объявила, что версия 8.0 будет иметь общие табличные выражения в MySQL (CTE) . Так можно будет писать такие запросы:
источник
В Sql оператор with указывает временный именованный набор результатов, известный как общее табличное выражение (CTE). Его можно использовать для рекурсивных запросов, но в этом случае он указывается как подмножество. Если mysql допускает подзапросы, я бы попробовал
источник
Я перешел по ссылке, которой поделился Лисаченко, и нашел еще одну ссылку на этот блог: http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html
В сообщении описаны способы эмуляции двух вариантов использования SQL WITH. Действительно хорошее объяснение того, как они работают для выполнения запроса, аналогичного SQL WITH.
1) Используйте WITH, чтобы не выполнять один и тот же подзапрос несколько раз
2) Рекурсивные запросы могут выполняться с помощью хранимой процедуры, которая делает вызов похожим на рекурсивный запрос.
А это код или хранимая процедура
источник
Функция «Common Table Expression» недоступна в MySQL, поэтому вам нужно создать представление или временную таблицу для решения, здесь я использовал временную таблицу.
Упомянутая здесь хранимая процедура решит вашу задачу. Если я хочу получить всех членов моей команды и связанных с ними членов, эта хранимая процедура поможет:
Код:
Это можно вызвать с помощью:
источник
Эта функция называется общим табличным выражением http://msdn.microsoft.com/en-us/library/ms190766.aspx
Вы не сможете делать то же самое в mySQL, проще всего было бы создать представление, которое отражает этот CTE, и просто выбирать из представления. Вы можете сделать это с помощью подзапросов, но это будет плохо работать. Если вы столкнетесь с какими-либо CTE, которые выполняют рекурсию, я не знаю, как вы сможете воссоздать это без использования хранимых процедур.
РЕДАКТИРОВАТЬ: Как я сказал в своем комментарии, этот пример, который вы опубликовали, не требует CTE, поэтому вы должны упростить его для вопроса, поскольку его можно просто записать как
источник
CREATE/DROP VIEW
), И вы можете предоставить ему права.Мне понравился ответ @Brad из этой ветки , но мне нужен был способ сохранить результаты для дальнейшей обработки (MySql 8):
Что производит:
источник