В базе данных значения параметров объявлений хранятся в отдельной таблице. Один параметр - одна запись, с привязякой к объявлению и типу параметра.
Проблемы начались при попытке отфильтровать. Вот таблица:
id - уникальный порядковый номер в таблице
id_ads: - к какому объявлению привязано
p_id: группа параметров
value: значение параметра
{id:1, id_ads: "1", p_id: "1", value: "5"}
{id:2, id_ads: "1", p_id: "2", value: "1"}
{id:3, id_ads: "1", p_id: "3", value: "6"}
{id:4, id_ads: "1", p_id: "4", value: "11"}
{id:5, id_ads: "2", p_id: "1", value: "5"}
{id:6, id_ads: "2", p_id: "2", value: "4"}
{id:7, id_ads: "2", p_id: "3", value: "8"}
{id:8, id_ads: "2", p_id: "7", value: "8"}
{id:9, id_ads: "2", p_id: "7", value: "2"}
{id:10, id_ads: "3", p_id: "1", value: "5"}
{id:11, id_ads: "3", p_id: "2", value: "1"}
{id:12, id_ads: "3", p_id: "3", value: "8"}
{id:13, id_ads: "3", p_id: "6", value: "1"}
Запрос такой: Нужно показать номера объявления, которые имеют (p_id = 1 AND value = 5) (p_id = 2 AND value = 1)
одновременно
Под такие условия подпадает записи:
{id:1, id_ads: "1", p_id: "1", value: "5"}
{id:2, id_ads: "1", p_id: "2", value: "1"}
{id:5, id_ads: "2", p_id: "1", value: "5"}
{id:10, id_ads: "3", p_id: "1", value: "5"}
{id:11, id_ads: "3", p_id: "2", value: "1"}
Но так как одновременно они есть только у объявлений id_ads = 1 и id_ads = 3 то результатом должно быть: 1,3
Объявление № 2 (id_ads = 2) не подходит так как не содержит второго необходимого параметра.
Как я только не пытался, решить вопрос не смог. Буду надеется что кто-то знает решение.
Альтернативное решение # 1
получить эти 5 строк из базы, прогнать массивом php и увидеть что по одному из обьявлений 1 строка вместо двух (два условия), и удалить её.
Но это какой-то костыль.
Альтернативное решение # 2
Циклические запросы.
1. WHERE p_id = 1 AND value = 5
получаем массив id_ads: 1,2,3
WHERE p_id = 2 AND value = 1 AND id_ads IN (1,2,3) получаем (1,3).
Соотсветственно если пункта 2 зациклить на количество видов фильтров уменьшая конечный массив id_ads до нужного результата
Но опять костыль.
Заранее спасибо.
SELECT id_ads
FROM datatable
WHERE (p_id, value) IN ((1,5), (2,1)) -- 2 пары значений, но можно больше
GROUP BY id_ads
HAVING COUNT(DISTINCT p_id, value) = 2 -- столько, сколько пар значений
Если (p_id, value) уникально (не логика приложения, а именно уникальный/первичный индекс) - DISTINCT можно убрать.
Если я верно понял тебе нужно сделать выборку из выборки, можно так:
SELECT *
FROM `table`
WHERE
p_id = 1
AND
value = 5
AND
id_ads IN (SELECT id_ads
FROM `delete`
WHERE
p_id = 2
AND
value = 1)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите будет ли правильно использовать Master-Slave для синхронизации двух баз данных в таком кейсе: Имеется объект, доступ к интернету появляется...
Если вызывать код без паузы несколько раз то в сокет попадают данные с прошлого вызова