Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2016, 19:44   #1
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,156
По умолчанию Анализ покупок с помощью SQL

Всем привет. Собственно чето туплю после НГ, заклинило и все тут )))

Имеем табличку: id_user, id_book указывающую кто и что покупал...
Стоит задача: получить список всевозможных пар товаров, которые были куплены более чем одним человеком

что пытался:
Код:
SELECT DISTINCT b1.id_book, b2.id_book
FROM books AS b1, books AS b2
WHERE b1.id_user = b2.id_user && b1.id_book != b2.id_book
но это просто получение всевозможных неповторяющихся (надеюсь) пар товарв ... как сюда еще и условие привязать что эту пару товаров выбрало более 1 чел .. .не понимаю пока
ADSoft вне форума Ответить с цитированием
Старый 06.01.2016, 20:06   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
from ( select id_book from books group by id_book having count(id_user)>1 ) as b1,
 .... as b2
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.01.2016, 20:20   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так точно не повторяющиеся, а то будут пары 1,2 и 2,1
Код:
SELECT DISTINCT b1.id_user,b1.id_book AS book1, b2.id_book AS book2
FROM books AS b1, books AS b2
WHERE b1.id_user = b2.id_user and b1.id_book < b2.id_book
А потом засунуть в другой запрос
Код:
SELECT u.book1, u.book2
  FROM (
SELECT DISTINCT b1.id_user,b1.id_book AS book1, b2.id_book AS book2
FROM books AS b1, books AS b2
WHERE b1.id_user = b2.id_user and b1.id_book < b2.id_book
  ) U
  GROUP BY u.book1, u.book2
  HAVING COUNT(*)>1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.01.2016, 20:40   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,156
По умолчанию

не очень понятно почему < ?
дошло... надо меньше пить, пить меньше надо (с) ))))

при попытке запроса - u.book1, u.book2 ругается на неизвестные поля book1

Последний раз редактировалось ADSoft; 06.01.2016 в 20:44.
ADSoft вне форума Ответить с цитированием
Старый 06.01.2016, 20:49   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
b1.id_user,b1.id_book AS book1, b2.id_book AS book2
Псевдонимы поставил?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.01.2016, 20:53   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,156
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Псевдонимы поставил?
само собой...
кстати он даже запрос типа SELECT * FROM (приведенный выше запрос) Не может отработать

с примерно 980 тыс записей.... запрос генерит порядка 7 млн пар.... нельзя ли еще внутри того запроса как то ограничить... группировкой например
ADSoft вне форума Ответить с цитированием
Старый 06.01.2016, 20:55   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А СУБД какая? На MS SQL 2012 проверил, мой летает
Цитата:
SELECT * FROM
Это о чем?
Цитата:
группировкой например
DISTINCT заменить на GROUP BY по трем полям? DISTINCT неявно все равно это же делает, хотя проверь, может что-то и выиграешь. А в принципе там хорошо нужно подумать, что бы другим запросом. Я не думал, просто твой адаптировал. Да, еще индексы что бы были по юзеру и книге
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.01.2016 в 21:05.
Аватар вне форума Ответить с цитированием
Старый 06.01.2016, 21:05   #8
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,156
По умолчанию

MySQL.... все поля индексированы - в принципе запрос быстро отрабатывет внутренний.... а вот внешний который с хавингом счетчика пол-ва пар..... умирает

ограничил внутрений запрос 300 записями для примера...... посмотрел - отрабатывает - но COUNT всем 1 считает, хотя это не так ((((
ADSoft вне форума Ответить с цитированием
Старый 06.01.2016, 21:11   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

HAVING отрабатывает после всего, на полном комплекте и медленный естественно
Цитата:
но COUNT всем 1 считает, хотя это не так
чего не так? Запросто
Попробуй так, при условии, что парочка id_user,id_book уникальна в таблице. Хотя не уверен на счет этого запроса
Код:
SELECT b1.id_book, b2.id_book
  FROM books AS b1, books AS b2
  WHERE b1.id_user = b2.id_user and b1.id_book < b2.id_book
  GROUP BY b1.id_book,b2.id_book
  HAVING COUNT(*)>1
или так, что быстрей
Код:
SELECT U.book1,U.book2
FROM (
SELECT b1.id_book AS book1, b2.id_book AS book2,COUNT(*) AS CountPara
  FROM books AS b1, books AS b2
  WHERE b1.id_user = b2.id_user and b1.id_book < b2.id_book
  GROUP BY b1.id_book,b2.id_book) U
WHERE U.CountPara>1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.01.2016 в 21:21.
Аватар вне форума Ответить с цитированием
Старый 06.01.2016, 22:56   #10
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,156
По умолчанию

взял внутренний запрос из последнего приведенного, и уже в php отсеял >1
всем спасибо!
... теперь думаю как к этому запросу прикрутить кол-во не только пар, но и вообще все покупателей данного товара (book1). (book2)
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
T-SQL проверка на update помощью trigger xxbesoxx SQL, базы данных 10 27.11.2015 21:24
Сортировка с помощью SQL в Firebird2.5 GetMax Помощь студентам 15 02.07.2014 00:54
Запись в БД с помощью SQL Анка_К БД в Delphi 4 30.09.2013 12:13
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
написать БД на Delphi с помощью SQL Tanchik Фриланс 2 13.06.2007 19:06