|
|
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Помогите, пожалуйста, кто чем может. Есть такая таблица 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. С таким методом, при большом количестве filter_id, плодятся JOINы и тормозит всё. Должно быть что-то лаконичнее. Подскажите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 01:26 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
Ну так ты сначала выбери те записи, у которых есть 10 и 20 А потом те id, по которым есть дубли. having count(product_id)=2 И не плоди join ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 03:32 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
Разобью на два, но можно объединить. Код: sql 1. 2. 3. Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 03:38 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
сории. having при DISTINCT может не работать. Grop BY cделай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 03:56 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
Или вот так попробуй Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 04:06 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. Если существует индекс (product_id,filter_id) UNIQUE или обратный - то DISTINCT не нужен. Иначе лучше пусть будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 09:26 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
SELECT product_id FROM product_filter WHERE filter_id IN (10,20) GROUP BY product_id HAVING COUNT(DISTINCT filter_id)=2 СПАСИБО!) Каким-то образом оно работает.... НЕ могу понять почему оно работает Код: sql 1. что делает эта часть? Просто в выборку попадают значения у которых количество filter_id и два и больше двух. Извиняюсь, просто хочу разобраться, а не бездумно копировать. Чтоб потом не задавать однотипные вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 10:11 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. что делает эта часть? Просто в выборку попадают значения у которых количество filter_id и два и больше двух. После группировки выбираем только те filter_id, которых до группировки было две. http://www.site-do.ru/db/sql8.php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 10:21 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
982183, Akina Спасибо большое, ребята. Понял! Туго но дошло. Ещё раз спасибо что потратили время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 10:22 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
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. И в этом случае наличие уникального индекса - обязательно. Либо, если такой индекс ну никак не возможно ввести, запрос может быть таким: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 10:24 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
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. С таким методом, при большом количестве filter_id, плодятся JOINы и тормозит всё. Должно быть что-то лаконичнее. Подскажите, пожалуйста. тут ничего не сделать, это лучший вариант. единственно, ты сначала таблицу product возьми, а потом join - и к ней все фильтры. тогда не нужно будет делать distinct. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 11:44 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
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. И в этом случае наличие уникального индекса - обязательно. Либо, если такой индекс ну никак не возможно ввести, запрос может быть таким: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. это только хуже, это все product перебирать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 11:46 |
|
||
|
Выборка из базы без уникального поля.
|
|||
|---|---|---|---|
|
#18+
И нтересно. Всё же просьба к автору замерить скорость На практике проверим теорию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2016, 11:53 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=91&tid=1831383]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
41ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 286ms |

| 0 / 0 |
