powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
25 сообщений из 25, страница 1 из 1
Помогите с запросом
    #39491860
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы, humans и sales. В первой люди name, date_create. Во второй name, date_sale, human_id. В первой имена людей и дата регистрации, во второй название продукта, дата покупки, и id пользователя который купил. Нужны имена людей которые покупали флешки, но не покупали диски.

Например человек Андрей купил и флешку и диск, Максим тоже. Другие только флешки. Нужно вывести только тех кто покупал флешку. Андрея и Максима не нужно показывать так как они флешки покупали.

Спасибо!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39491900
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я делал так:

Код: plsql
1.
2.
select users.name * from users JOIN sales on user.id = sales.user_id
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'



Он выводит всех людей которые купили 'flash_disk' но и выводятся и те кто купил 'dvd_disk'. Нужно только тех кто купил 'flash_disk'.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39491950
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstr,

почитайте про [NOT] EXISTS -подзапросы. Это как раз Ваш случай. Потому как Вам нужно ввести всех тех, кто покупал флэшку, но при этом у кого не существует в списке покупок DVD-диска... :) ;)
как вариант - использовать LEFT JOIN выборки покупателей флэшек с выборкой покупателей "не флэшек" (всего остального) с последующей фильтрацией только тех пользователей, для которых выборка "не флэшек" окажется пустой.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492143
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstrЯ делал так:

Код: plsql
1.
2.
select users.name * from users JOIN sales on user.id = sales.user_id
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'



Он выводит всех людей которые купили 'flash_disk' но и выводятся и те кто купил 'dvd_disk'. Нужно только тех кто купил 'flash_disk'.

1. и именно этот запрос работает? нет синтаксичских ошибок?
2. смысл этого совсем не понятен:
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492165
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

Синтаксическая ошибка есть в "on user.id = sales.user_id", там должно быть "on users.id".
Ну я хочу чтобы он показал мне только тех кто покупал 'flash_disk'.

Как сейчас:

Андрей flash_disk
Илья flash_disk
Максим flash_disk
Андрей dvd_disk

Он мне выводит всех (Андрей, Илья, Максим). А Максим тут лишний, хоть он и покупал flash_disk, но купил dvd_disk, его нам уже не надо.

Нужно чтобы вывел только Илью и Максима.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492231
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstrРолг Хупин,

Синтаксическая ошибка есть в "on user.id = sales.user_id", там должно быть "on users.id".
Ну я хочу чтобы он показал мне только тех кто покупал 'flash_disk'.

Как сейчас:

Андрей flash_disk
Илья flash_disk
Максим flash_disk
Андрей dvd_disk

Он мне выводит всех (Андрей, Илья, Максим). А Максим тут лишний, хоть он и покупал flash_disk, но купил dvd_disk, его нам уже не надо.

Нужно чтобы вывел только Илью и Максима.

мне не ясно, каким образом у вас получается такая выборка, если критерий указан

Код: sql
1.
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'



или вы что-то недоговариваете
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492246
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

Ну смотрим, что у нас есть.

Андрей 'flash_disk'
Андрей 'dvd_disk'
Максим 'flash_disk'
Илья 'flash_disk'

По запросу
Код: plsql
1.
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'



он берет:
Андрей 'flash_disk'
Андрей 'dvd_disk' пропускает, т.к. sales.name != 'dvd_disk'
Максим 'flash_disk'
Илья 'flash_disk'

Вывод:
Андрей 'flash_disk'
Максим 'flash_disk'
Илья 'flash_disk'

Как сделать чтобы Андрея не было? Так как Андрей купил 'flash_disk' и 'dvd_disk', по условию нужно чтобы только тех кто купил 'flash_disk' и больше ничего
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492252
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstr...Как ...not exists
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492264
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstrРолг Хупин,

Ну смотрим, что у нас есть.

Андрей 'flash_disk'
Андрей 'dvd_disk'
Максим 'flash_disk'
Илья 'flash_disk'

По запросу
Код: plsql
1.
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'



он берет:
Андрей 'flash_disk'
Андрей 'dvd_disk' пропускает, т.к. sales.name != 'dvd_disk'
Максим 'flash_disk'
Илья 'flash_disk'

Вывод:
Андрей 'flash_disk'
Максим 'flash_disk'
Илья 'flash_disk'

Как сделать чтобы Андрея не было ? Так как Андрей купил 'flash_disk' и 'dvd_disk', по условию нужно чтобы только тех кто купил 'flash_disk' и больше ничего

Вам не кажется, что это
and sales.name != 'dvd_disk'
лишнее в этом критерии

Код: sql
1.
where sales.name = 'flash_disk' and sales.name != 'dvd_disk'


?

вы выбираете всё, что sales.name = 'flash_disk', смысл указывать, что поле со значением 'flash_disk' не должно иметь значение равное 'dvd_disk'. Зачем?
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492268
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаdr.monstr...Как ...not exists

100%!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492273
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C NOT EXISTS не получилось, не знаю как реализовать. Сделал по другому, зато работает.
Код: plsql
1.
2.
select * from users
where users.id not in(select sales.client_id from sales where sales.name = 'smetana')



А по поводу NOT EXISTS, напишите пример как реализовывается. Спасибо
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492277
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstr,

д ё...
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492314
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще такой вопрос появился. Еще нужно сделать так, если пользователь купил 'dvd_disk' в прошлом месяце то его тоже добавлять.

Андрей 'flash_disk' 20.07.2017
Андрей 'dvd_disk' 20.05.2017
Максим 'flash_disk' 20.07.2017
Илья 'flash_disk' 20.07.2017

Если Андрей купил диск не за последний месяц, то его тоже добавлять.

Т.е. вывод будет выглядеть так:

Андрей 'flash_disk' 20.07.2017
Андрей 'dvd_disk' 20.05.2017
Максим 'flash_disk' 20.07.2017
Илья 'flash_disk' 20.07.2017
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492391
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstrЕще такой вопрос появился. Еще нужно сделать так, если пользователь купил 'dvd_disk' в прошлом месяце то его тоже добавлять.

Андрей 'flash_disk' 20.07.2017
Андрей 'dvd_disk' 20.05.2017
Максим 'flash_disk' 20.07.2017
Илья 'flash_disk' 20.07.2017

Если Андрей купил диск не за последний месяц, то его тоже добавлять.

Т.е. вывод будет выглядеть так:

Андрей 'flash_disk' 20.07.2017
Андрей 'dvd_disk' 20.05.2017
Максим 'flash_disk' 20.07.2017
Илья 'flash_disk' 20.07.2017

1. вы не ответили не мой вопрос по поводу критерия
2. давайте ваш вариант, будем анализировать
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492395
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин, давайте.

Нужен запрос, который выберет имена пользователей, которые когда либо покупали флешку, но не покупали DVD диск за последний месяц
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492398
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока есть вот такой вариант, но он не правильно работает. Выводит еще Олега который вообще ничего не купил, знаю почему выводит, просто не знаю как правильно сделать. И еще выводит Алексея который тоже ничего из этого не покупал.

Вот код:
Код: plsql
1.
2.
3.
4.
select * from clients
where clients.id not in(
         select sales.client_id from sales 
         where sales.name = 'smetana' and sales.date > Now() - interval '1 month' )
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492399
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот правильный, предыдущий от другого

Код: plsql
1.
2.
3.
4.
5.
select * from users
where users.id 
not in(
select sales.client_id from sales 
where sales.name = 'dvd_disk' and sales.date > Now() - interval '1 month' )
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492413
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstrВот правильный, предыдущий от другого

Код: plsql
1.
2.
3.
4.
5.
select * from users
where users.id 
not in(
select sales.client_id from sales 
where sales.name = 'dvd_disk' and sales.date > Now() - interval '1 month' )



Ладно, не хотите отвечать - не надо.
Как такое?

Список юзеров, кот покупал флешдиск, но не в списке тех, кто покупал все, что угодно, но не флешдиск в последний месяц

select * from
users JOIN sales on user.id = sales.user_id
where sales.name = 'flash_disk'
and users.id
not in(
select sales.client_id from sales
where sales.name != 'flash_disk'
and sales.date > Now() - interval '1 month' )
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492425
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Ролг Хупин]dr.monstrРолг Хупин,

Вы про это: Вам не кажется, что это and sales.name != 'dvd_disk' лишнее в этом критерии ??



Может и лишнее, я пробую по разному. Кстати ваш код не сработал
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492451
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать 1) UNION/INTERSECT/EXCEPT, или 2) OUTER JOIN, или 3) IN/NOT IN, или 4) EXISTS/NOT EXISTS.

> Список юзеров, кот покупал флешдиск, но не в списке тех, кто покупал все, что угодно, но не флешдиск в последний месяц

Код: sql
1.
2.
3.
SELECT users.* FROM users JOIN sales ON user.id = sales.user_id WHERE sales.name = 'flash_disk'
EXCEPT
SELECT users.* FROM users JOIN sales ON user.id = sales.user_id WHERE sales.name <> 'flash_disk' AND now() - sales.date < interval '1 month'
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492478
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat<>
> Список юзеров, кот покупал флешдиск, но не в списке тех, кто покупал все, что угодно, но не флешдиск 'dvd_disk' в последний месяц

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT users.* FROM users
WHERE EXISTS( SELECT 1 from sales WHERE user.id = sales.user_id
   AND sales.name = 'flash_disk')
EXCEPT
SELECT users.* FROM users
WHERE EXISTS( SELECT 1 from sales  WHERE user.id = sales.user_id
 AND sales.name = 'dvd_disk'  AND date'today' - sales.date < interval '1 month'
 )



если юзвери так и шастають, раздувать наборы перед except--ом джойнами лучше не надо.
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492482
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq, оооо !!!! Работает как надо!!! Спасибо
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492484
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq, что значит в строке 'SELECT 1 from sales', 1 ???
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492503
dr.monstr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Молодец!!! Спасибо большое!
...
Рейтинг: 0 / 0
Помогите с запросом
    #39492592
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dr.monstrМолодец!!! Спасибо большое!

" Нужно вывести только тех кто покупал флешку . Андрея и Максима не нужно показывать так как они флешки покупали. "

Вас *** поймёшь, вот, что там написано?

Почему не надо показывать А и М?
Или надо?

Если там ошибка, тогда надо исправить устроивший вас запрос
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]