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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2016, 02:23   #1
Paharok
Новичок
Джуниор
 
Регистрация: 27.09.2016
Сообщений: 5
Вопрос Выборка из базы без уникального поля.

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

product_id | filter_id
------------------------
1 | 10
1 | 20
2 | 5
2 |10
3 | 10
3 | 20

Суть в чём. Надо выбрать уникальные product_id у которых есть filter_id И 10 И 20. В данном случае мне должно вернуть 1 и 3

1. Таких строк с одинаковым product_id может быть хоть 100
2. Сами строки (пара product_id и filter_id) уникальны

Сейчас работает так:
Код:
SELECT DISTINCT filt1.product_id FROM product_filter filt1
JOIN product_filter filt2 ON(filt2.product_id=filt1.product_id)
WHERE filt1.filter_id=10 AND filt2.filter_id=20
С таким методом, при большом количестве filter_id, плодятся JOINы и тормозит всё. Должно быть что-то лаконичнее. Подскажите, пожалуйста.
Paharok вне форума Ответить с цитированием
Старый 27.09.2016, 02:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

индексы то есть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.09.2016, 09:12   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

э... А зачем ЗДЕСЬ соединение.

Код:
SELECT DISTINCT filt1.product_id FROM product_filter filt1
JOIN product_filter filt2 ON(filt2.product_id=filt1.product_id)
WHERE filt1.filter_id=10 AND filt1.filter_id=20
Цитата:
Должно быть что-то лаконичнее.
Код:
SELECT DISTINCT filt1.product_id 
FROM product_filter 
WHERE filter_id=10 AND filter_id=20 AND .....
Цитата:
при большом количестве filter_id,
Код:
where filter_id IN (10,20, ....)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.09.2016 в 09:15.
evg_m вне форума Ответить с цитированием
Старый 27.09.2016, 09:19   #4
Paharok
Новичок
Джуниор
 
Регистрация: 27.09.2016
Сообщений: 5
Печаль

Цитата:
индексы то есть?
Индексов нет. В таблице 2 столбика

Цитата:
where filter_id IN (10,20, ....)
IN работает как OR , а мне надо как AND

Цитата:
SELECT DISTINCT filt1.product_id
FROM product_filter
WHERE filter_id=10 AND filter_id=20 AND .....
Так не получится. Нет и не будет ни одной строки чтоб filter_id был равен и 10 и 20.
По этому то тут присутствует JOIN.
Paharok вне форума Ответить с цитированием
Старый 27.09.2016, 09:27   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас фильтров может быть только два или более тоже?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.09.2016, 09:38   #6
Paharok
Новичок
Джуниор
 
Регистрация: 27.09.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас фильтров может быть только два или более тоже?
1,2,3 ... 100 (
Paharok вне форума Ответить с цитированием
Старый 27.09.2016, 11:40   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select f10.product_id
from       ( select distinct product_id from t where filter_id=10) as f10 -- ??? наверное ЗДЕСЬ лучше получить самое маленькое  множество 
inner join ( select distinct product_id from t where filter_id=20) as f20 on f20.product_id =f10.product_id
inner join ........ фильтров может быть сколь угодно много
и БЕЗУСЛОВНО для УСКОРЕНИЯ поисков НУЖНЫ индексы по filter_id + product_id

Цитата:
Сами строки (пара product_id и filter_id) уникальны
distinct ВЫЧЕРКИВАЕМ везде.
Код:
select f10.product_id
from       ( select product_id from t where filter_id=10) as f10 -- ??? наверное ЗДЕСЬ лучше получить самое маленькое  множество 
inner join ( select product_id from t where filter_id=20) as f20 on f20.product_id =f10.product_id
inner join ........ фильтров может быть сколь угодно много
Код:
select f10.product_id
from   t as f10
inner join t as on f20.product_id =f10.product_id and f20.filter_id =20
inner join ........ фильтров может быть сколь угодно много 

where f10.filter_id=10
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.09.2016 в 12:14.
evg_m вне форума Ответить с цитированием
Старый 27.09.2016, 11:45   #8
Paharok
Новичок
Джуниор
 
Регистрация: 27.09.2016
Сообщений: 5
По умолчанию

Надо выбрать уникальные product_id у которых есть filter_id И 10 И 20

Но проблема в том что это будут две (или больше) разные строки

Есть у нас 2 записи в базе, к примеру.

product_id | filter_id
------------------------
1 | 10
1 | 20

Представьте что там много чего другого.
нам надо получить product_id у которого filter_id=10 AND filter_id=20

Если сделать как вы говорите


SELECT DISTINCT filt1.product_id
FROM product_filter
WHERE filter_id=10 AND filter_id=20

то мы ничего не получим. разные строки, как видите.
Paharok вне форума Ответить с цитированием
Старый 27.09.2016, 11:47   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как я понял это таблица связи Many-To-Many.
нужно найти продукты что имеют нужные(Contains) примененные к ним фильтры.

из более лаконичного разве что могу придумать массивы, но тут уже сильно зависит от движка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.09.2016, 11:53   #10
Paharok
Новичок
Джуниор
 
Регистрация: 27.09.2016
Сообщений: 5
По умолчанию

Да, именно такая таблица получается. Это всё дело в MySQL. Я даже не знаю какие тут массивы могут быть. Подскажите пожалуйста, а если не трудно - напишите маленький примерчик, чтоб я понимал в каком направлении искать. Буду очень благодарен.
Paharok вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка из базы Vasiliska БД в Delphi 6 11.06.2012 21:11
Сумма не уникального поля. Дмитрий mause Помощь студентам 4 25.01.2012 17:08
Выборка из базы MS Access Provoking Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 06.03.2011 20:39
выборка из базы Alex_2007_bur БД в Delphi 18 04.09.2009 12:14
Выборка пустого поля yulia БД в Delphi 2 09.05.2009 17:07