2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 SQL. Как корректно составить запрос?
Сообщение22.07.2016, 15:55 


14/12/14
454
SPb
Помогите, пожалуйста, разобраться.
Использую SQLite.
Даны две таблицы -- Users и Products.
Поля Users = user_id (PK), user_name, account_balance.
Поля Services = service_id (PK), user_id (FK), sum_pay, time_from, time_to.

В тестовой таблице Users содержится всего 3 пользователя: Jon, Helen, Bob.
В Services всего 12 записей, характеризующих платежную дисциплину пользователей по услугам/сервисам.

Задача. Найти пользователей (user_name), не оплативших ни одной услуги за период более одного месяца.

Мой запрос выглядит так:
Используется синтаксис SQL
SELECT user_name FROM Users, Services
WHERE Users.user_id = (SELECT user_id FROM Services EXCEPT SELECT user_id FROM Services WHERE (time_to - time_from) > 1 GROUP BY user_id).
 

Запрос срабатывает и выдает почему-то 12 повторяющихся строк с user_name = Bob, так как только он в тестовой выборке обладает заданной характеристикой (у него нет услуг, которые он заказывал более чем на 1 месяц). Но необходима всего одна строка по каждому найденному пользователю.

Условие:
Используется синтаксис SQL
SELECT user_id FROM Services EXCEPT SELECT user_id FROM Services WHERE (time_to - time_from) > 1 GROUP BY user_id
 
работает корректно. Определяет id Боба. Вопрос именно в формате итогового вывода результата.

 Профиль  
                  
 
 Re: SQL. Как корректно составить запрос?
Сообщение22.07.2016, 16:34 
Заслуженный участник
Аватара пользователя


01/09/13
4318
timber в сообщении #1139489 писал(а):
Запрос срабатывает и выдает почему-то 12 повторяющихся строк

У Вас нет связки с таблицей service в этом запросе. Поэтому каждый значимый результат будет умножаться на количество записей в ней.
Надо просто убрать таблицу из самого внешнего запроса.

 Профиль  
                  
 
 Re: SQL. Как корректно составить запрос?
Сообщение22.07.2016, 16:52 


14/12/14
454
SPb
Geen в сообщении #1139496 писал(а):
timber в сообщении #1139489 писал(а):
Запрос срабатывает и выдает почему-то 12 повторяющихся строк

У Вас нет связки с таблицей service в этом запросе. Поэтому каждый значимый результат будет умножаться на количество записей в ней.
Надо просто убрать таблицу из самого внешнего запроса.


Не понимаю Вас. Я новичок. Думаю, что может быть тут нужно применять JOIN.

Вы предлагаете написать запрос так?
Используется синтаксис SQL
SELECT user_name FROM Users
WHERE Users.user_id = (SELECT user_id FROM Services EXCEPT SELECT user_id FROM Services WHERE (time_to - time_from) > 1 GROUP BY user_id).

 Профиль  
                  
 
 Re: SQL. Как корректно составить запрос?
Сообщение22.07.2016, 23:54 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
timber в сообщении #1139489 писал(а):
Даны две таблицы -- Users и Products.
Поля Users = user_id (PK), user_name, account_balance.
Поля Services = service_id (PK), user_id (FK), sum_pay, time_from, time_to.
Во-первых, таблица все-таки Products или Services? Во-вторых, обычно в таких случаях принято определения таблиц давать в виде DDL - это сразу снимает кучу вопросов и позволяет помогающему вам человеку создать таблицу у себя. Типа такого:
Используется синтаксис SQL
CREATE TABLE users (
id NUMBER,
user_name varchar2,
account_balance NUMBER);
(не знаю, какие у вас там типы в SQLite, я оракловые написал).

timber в сообщении #1139489 писал(а):
В Services всего 12 записей, характеризующих платежную дисциплину пользователей по услугам/сервисам.
Каким образом она характеризует платежную дисциплину? У вас пока просто написано в запросе (time_to - time_from) > 1 (совершенно без объяснений, что это за вычисления), следовательно, если это условие записано неверно, гадать можно будет долго.

timber в сообщении #1139500 писал(а):
Не понимаю Вас. Я новичок. Думаю, что может быть тут нужно применять JOIN.
У вас в первом вашем запросе в секции FROM указаны две таблицы, а условие связи таблиц в секции WHERE не заданы, соответственно, СУБД возвращает вам полное декартово произведение (число строк запроса будет равно произведению числа строк каждой из таблиц).

 Профиль  
                  
 
 Posted automatically
Сообщение23.07.2016, 00:09 
Админ форума
Аватара пользователя


19/03/10
8952
 i  Тема перемещена из форума «Computer Science» в форум «Программирование»

 Профиль  
                  
 
 Re: SQL. Как корректно составить запрос?
Сообщение23.07.2016, 08:26 


08/05/08
593
timber в сообщении #1139500 писал(а):
Не понимаю Вас. Я новичок. Думаю, что может быть тут нужно применять JOIN.

Думаю, что как раз не нужно. А нужно exists
типа select * from users a where not exists (select 1 from services b where b.user_id=a.user_id and b.timefrom или timeto? не понял структуры>:текущая дата минус месяц, не знаю, как там точно в sqlite)

 Профиль  
                  
 
 Re: SQL. Как корректно составить запрос?
Сообщение23.07.2016, 13:36 


27/08/14
206
Условие не понятное. Что означает "не оплативших ни одной услуги за период более одного месяца":
а) есть промежуток времени более месяца, когда не действовала ни одна услуга
или
б) за последний месяц не действовала ни одна услуга?
Ещё в SQLite нет встроенного типа данных для даты, поэтому важно в каком виде хранится дата в полях time_from и time_to.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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



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

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


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

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