2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 16:15 


15/11/15
916
rockclimber в сообщении #1310416 писал(а):
но пока не вижу причин, почему может не получиться
Причина будет:
Код:
MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'.
Увы, MySQL не поддерживает limit в подзапросах.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 16:34 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Оох... :facepalm: Все, у меня фантазия иссякла.

-- 06.05.2018, 17:39 --

Не, конечно всегда остается тупой как валенок способ "взять последний заказ каждого пользователя, потом взять последний заказ за вычетом того, что взяли на прошлом шаге, потом опять взять последний за вычетом предыдущих", но так надо писать по подзапросу на каждый чих, чтобы взять последние 10 записей, придется писать 10 подзапросов. Помогла бы рекурсия, но дайте угадаю - ее в MySQL тоже нет? :wink:

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 17:24 


15/11/15
916
Да, валенок не очень... увы, про рекурсии в запросах первый раз слышу... Думаю, можно создать вычисляемое поле - счетчик row_number, который тикает для каждого пользователя 1,2,3 от новых заказов к старым... и вывести все записи для row_number<4. Но и то надо погуглить, как это сделать.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 17:35 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Стандарт описывает специальную конструкцию WITH RECURSIVE.
Вот пример для PostgreSQL: https://stackoverflow.com/questions/186 ... ive-clause
Гугл говорит, что в 8 версии MySQL такое теперь тоже есть.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 23:34 


07/08/14
4231
rockclimber в сообщении #1310431 писал(а):
взять последний заказ каждого пользователя, потом взять последний заказ за вычетом того, что взяли на прошлом шаге, потом опять взять последний за вычетом предыдущих", но так надо писать по подзапросу на каждый чих
есть такой прием что то вроде (выбрать из "таб2", получаемую выборкой из "таб1", и назвать полученное "таб1") но ооочень долго работает.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение23.06.2018, 19:59 


15/11/15
916
LazyFool1 в сообщении #1308675 писал(а):
1) Write an SQL query to return all users that have at least one order. Every user should come with 3 most recent orders (or fewer if this user has fewer than 3).
Ответ(?):

Я смог написать трехэтажный ответ для одной таблицы (нагуглил похожее).

SELECT a.user_id, a.created_at, count(*) as row_number FROM orders a
JOIN orders b ON a.user_id = b.user_id AND a.created_at <= b.created_at
GROUP BY a.user_id, a.created_at
HAVING row_number <= 3 order by a.user_id, a.created_at DESC, row_number


Этот запрос почти дает ответ, только вместо имен пользователей выводятся их ИДы. Осталось как то прикрутить таблицу users, и вместо ИДов выводить имена юзеров. Хотя, может, так и не стоит делать, по отзывам, такие запросы работают медленно.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение23.06.2018, 20:23 
Заслуженный участник
Аватара пользователя


01/09/13
4318
rockclimber в сообщении #1310450 писал(а):
Стандарт описывает специальную конструкцию WITH RECURSIVE.

В Oracle это иначе делается...

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение23.06.2018, 21:23 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Geen в сообщении #1322105 писал(а):
rockclimber в сообщении #1310450 писал(а):
Стандарт описывает специальную конструкцию WITH RECURSIVE.

В Oracle это иначе делается...
В оракле это делается двумя способами - "стандартным" и через CONNECT BY. Только "стандартным" способом слово RECURSIVE писать не нужно.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group