Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего) / 6 сообщений из 6, страница 1 из 1
28.09.2017, 16:42
    #39527799
atillus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
Добрый день!
Хочу сделать одним запросом следующее:

Код: sql
1.
2.
3.
4.
SELECT * FROM `properties` WHERE `field_1` = 'some_value' AND `field_2` = 'some_other_value';
цикл {
SELECT * FROM [результат предыдущего SELECT] WHERE `field_1` = 'some_value' AND `field_2` = 'some_other_value';
}



Собственно, задача в чем:

В таблице хранятся свойства товаров... Структура таблицы такова: id|prod_id|feature_id|value

Связи:
prod_id => id из таблицы products
feature_id => id из таблицы features

Мне нужно получить товары, у которых нужный мне feature_id и value и при этом фильтров может быть несколько...
...
Рейтинг: 0 / 0
28.09.2017, 16:48
    #39527808
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
atillusфильтров может быть несколько...
В зависимости от логики фильтры объединяются операторами OR либо AND. В одном запросе, без наворотов.
...
Рейтинг: 0 / 0
28.09.2017, 16:59
    #39527822
atillus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
Akina, не получается так...

Вот почему:

[CSV]
id,prod_id,feature_id,value
1,234,3,зеленый
2,237,3,красный
3,245,4,большой
3,246,4,маленький
[CSV]

-- если так
WHERE ( feature_id = 3 AND value = 'зеленый' ) AND ( feature_id = 4 AND value = 'большой' )
-- результат: ноль

-- если так
WHERE ( feature_id = 3 AND value = 'зеленый' ) OR ( feature_id = 4 AND value = 'большой' )
-- результат: все
...
Рейтинг: 0 / 0
28.09.2017, 17:57
    #39527893
atillus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
Я сделал для образца небольшой пример (облегченный и упрощенный) - дамп приложил.

Если делать так:

Код: sql
1.
2.
3.
4.
SELECT DISTINCT products.id, products.prod_name FROM products
LEFT JOIN properties ON properties.prod_id = products.id
WHERE properties.feature_id = 1 AND properties.value = 'черный'
OR properties.feature_id = 2 AND properties.value = '41'



то получим и все черные, и все 41-го размера

А если так:

Код: sql
1.
2.
3.
4.
SELECT DISTINCT products.id, products.prod_name FROM products
LEFT JOIN properties ON properties.prod_id = products.id
WHERE properties.feature_id = 1 AND properties.value = 'черный'
AND properties.feature_id = 2 AND properties.value = '41'



то не получим ничего...

Поэтому я ищу возможность поочередно применять условия к предыдущему результату...
...
Рейтинг: 0 / 0
28.09.2017, 19:52
    #39527921
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
Следует выбрать все записи с нужными комбинациями (feature_id,value), сгруппировать по продукту и подсчитать количество отобранных для продукта записей.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT products.id, products.prod_name 
FROM products
INNER JOIN properties ON properties.prod_id = products.id
-- можно и так
-- WHERE (properties.feature_id = 1 AND properties.value = 'черный')
-- (OR properties.feature_id = 2 AND properties.value = '41')
-- но нагляднее так 
WHERE (properties.feature_id, properties.value) IN ((1, 'черный'), (2, '41'))
GROUP BY products.id 
-- если Server Mode = ONLY_FULL_GROUP_BY, то ещё и 
--                  , products.prod_name 
HAVING COUNT( -- если возможно дублирование записей
--           DISTINCT 
                      products.id) = 2
...
Рейтинг: 0 / 0
28.09.2017, 20:02
    #39527925
atillus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
Akina, спасибо. То, что нужно! GROUP BY и затем HAVING COUNT - самое верное решение.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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