powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
6 сообщений из 6, страница 1 из 1
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
    #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
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
    #39527808
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
atillusфильтров может быть несколько...
В зависимости от логики фильтры объединяются операторами OR либо AND. В одном запросе, без наворотов.
...
Рейтинг: 0 / 0
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
    #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
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
    #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
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
    #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
Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
    #39527925
atillus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, спасибо. То, что нужно! GROUP BY и затем HAVING COUNT - самое верное решение.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как сделать выборку под циклом (каждый последующий запрос - к результату предыдущего)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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