powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из базы без уникального поля.
14 сообщений из 14, страница 1 из 1
Выборка из базы без уникального поля.
    #39315967
paharok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Помогите, пожалуйста, кто чем может.
Есть такая таблица

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) уникальны

Сейчас работает так:
Код: sql
1.
2.
3.
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ы и тормозит всё. Должно быть что-то лаконичнее. Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39315976
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так ты сначала выбери те записи, у которых есть 10 и 20
А потом те id, по которым есть дубли.

having count(product_id)=2

И не плоди join
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39315977
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобью на два, но можно объединить.

Код: sql
1.
2.
3.
SELECT DISTINCT * FROM product_filter filt1
WHERE filt1.filter_id=10 OR filt1.filter_id=20
INTO CURSOR QUERY



Код: sql
1.
2.
SELECT DISTINCT filt1.product_id FROM QUERY
having count(product_id)=2
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39315980
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сории. having при DISTINCT может не работать.
Grop BY cделай
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39315981
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или вот так попробуй
Код: sql
1.
2.
3.
4.
SELECT filt1.product_id FROM product_filter filt1
WHERE filt1.filter_id=10 OR filt1.filter_id=20
GROUP BY filt1.product_id
HAVING COUNT(product_id)=2
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316030
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT product_id 
FROM product_filter
WHERE filter_id IN (10,20)
GROUP BY product_id
HAVING COUNT(/* DISTINCT */ filter_id)=2


Если существует индекс (product_id,filter_id) UNIQUE или обратный - то DISTINCT не нужен. Иначе лучше пусть будет.
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316060
paharok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT product_id
FROM product_filter
WHERE filter_id IN (10,20)
GROUP BY product_id
HAVING COUNT(DISTINCT filter_id)=2

СПАСИБО!)
Каким-то образом оно работает....

НЕ могу понять почему оно работает

Код: sql
1.
HAVING COUNT(/* DISTINCT */ filter_id)=2



что делает эта часть? Просто в выборку попадают значения у которых количество filter_id и два и больше двух.

Извиняюсь, просто хочу разобраться, а не бездумно копировать. Чтоб потом не задавать однотипные вопросы.
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316065
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
HAVING COUNT(/* DISTINCT */ filter_id)=2


что делает эта часть? Просто в выборку попадают значения у которых количество filter_id и два и больше двух.

После группировки выбираем только те filter_id, которых до группировки было две.

http://www.site-do.ru/db/sql8.php
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316067
paharok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183, Akina
Спасибо большое, ребята. Понял! Туго но дошло. Ещё раз спасибо что потратили время.
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316068
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paharokчто делает эта часть?
Проверяет, что для данного product_id существуют filter_id и 10, и 20.

Да, с учётом того, что
paharok2. Сами строки (пара product_id и filter_id) уникальны
DISTINCT не требуется. Но именно при условии, что уникальность обеспечена индексом. Если за этим следит клиентское приложение, я бы рекомендовал создание такого уникального индекса. А вот если это невозможно, то DISTINCT обязателен.

paharokв выборку попадают значения у которых количество filter_id и два и больше двух.
В исходной задаче нет ограничения на отсутствие иных, кроме 10 и 20, значений filter_id.
Но если такое ограничение необходимо, то запрос будет другим:
Код: sql
1.
2.
3.
4.
5.
SELECT product_id 
FROM product_filter
GROUP BY product_id
HAVING SUM(filter_id IN (10,20))=2
   AND SUM(filter_id NOT IN (10,20))=0


И в этом случае наличие уникального индекса - обязательно.
Либо, если такой индекс ну никак не возможно ввести, запрос может быть таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT product_id 
FROM product_filter
GROUP BY product_id
HAVING SUM(DISTINCT CASE filter_id 
                    WHEN 10 THEN 1 
                    WHEN 20 THEN 2 
                            ELSE 0 
                    END
           )=3
   AND SUM(filter_id NOT IN (10,20))=0
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316137
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paharokЗдравствуйте. Помогите, пожалуйста, кто чем может.
Есть такая таблица

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) уникальны

Сейчас работает так:
Код: sql
1.
2.
3.
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ы и тормозит всё. Должно быть что-то лаконичнее. Подскажите, пожалуйста.


тут ничего не сделать, это лучший вариант.

единственно, ты сначала таблицу product возьми, а потом join - и к ней все фильтры.
тогда не нужно будет делать distinct.
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316140
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinapaharokчто делает эта часть?
Проверяет, что для данного product_id существуют filter_id и 10, и 20.

Да, с учётом того, что
paharok2. Сами строки (пара product_id и filter_id) уникальны
DISTINCT не требуется. Но именно при условии, что уникальность обеспечена индексом. Если за этим следит клиентское приложение, я бы рекомендовал создание такого уникального индекса. А вот если это невозможно, то DISTINCT обязателен.

paharokв выборку попадают значения у которых количество filter_id и два и больше двух.
В исходной задаче нет ограничения на отсутствие иных, кроме 10 и 20, значений filter_id.
Но если такое ограничение необходимо, то запрос будет другим:
Код: sql
1.
2.
3.
4.
5.
SELECT product_id 
FROM product_filter
GROUP BY product_id
HAVING SUM(filter_id IN (10,20))=2
   AND SUM(filter_id NOT IN (10,20))=0


И в этом случае наличие уникального индекса - обязательно.
Либо, если такой индекс ну никак не возможно ввести, запрос может быть таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT product_id 
FROM product_filter
GROUP BY product_id
HAVING SUM(DISTINCT CASE filter_id 
                    WHEN 10 THEN 1 
                    WHEN 20 THEN 2 
                            ELSE 0 
                    END
           )=3
   AND SUM(filter_id NOT IN (10,20))=0




это только хуже, это все product перебирать...
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316148
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И нтересно.
Всё же просьба к автору замерить скорость
На практике проверим теорию.
...
Рейтинг: 0 / 0
Выборка из базы без уникального поля.
    #39316208
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivэто все product перебирать...Кривая структура способна порождать только кривые решения.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из базы без уникального поля.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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