2014 dxdy logo

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

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




 
 SQL. Как корректно составить запрос?
Сообщение22.07.2016, 15:55 
Помогите, пожалуйста, разобраться.
Использую 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 
Аватара пользователя
timber в сообщении #1139489 писал(а):
Запрос срабатывает и выдает почему-то 12 повторяющихся строк

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

 
 
 
 Re: SQL. Как корректно составить запрос?
Сообщение22.07.2016, 16:52 
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 
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 
Аватара пользователя
 i  Тема перемещена из форума «Computer Science» в форум «Программирование»

 
 
 
 Re: SQL. Как корректно составить запрос?
Сообщение23.07.2016, 08:26 
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 
Условие не понятное. Что означает "не оплативших ни одной услуги за период более одного месяца":
а) есть промежуток времени более месяца, когда не действовала ни одна услуга
или
б) за последний месяц не действовала ни одна услуга?
Ещё в SQLite нет встроенного типа данных для даты, поэтому важно в каком виде хранится дата в полях time_from и time_to.

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group