24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Пишу свой простенький фильтр для интернет магазина. Помогите пожалуйста с запросом.
Для начала опишу упрощенно структуру БД. Не обращайте внимания на некоторую избыточность, это сделано для упрощения запросов. Таблицы разбил по группам, чтобы выделить жирным отдельные поля, которые значат одно и то же.
products - id, name - таблица с товарами subproducts - id, productid, price - таблица подтоваров. Просто у меня в один товар входит несколько подтоваров, каждый может иметь свою цену и определяется по количеству фильтров
filters - id, name - таблица с группой фильтров. Этой таблицей мы характеризуем группу фильтров, например, "цвет" filter_parameters - id, filterid, value - это конкретно сами фильтры, разбитые по группам и имеющие значения
subproduct_filter_values - id, productid, subproductid, valueid - это таблица, которая в себе связывает айди подтовара с айди фильтра.
Сперва я сделал вот такой запрос (выделил жирным часть запроса с фильтрами): SELECT FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=20 or `t2`.`valueid`=21) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
И мне показалось, что работает. Но потом я отправил запрос, добавив ещё фильтр: SELECT FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=12 or `t2`.`valueid`=13 or `t2`.`valueid`=19 or `t2`.`valueid`=20 or `t2`.`valueid`=21) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Видите, там фильтры перебираются через условия or? Если фильтры относятся к одной группе, то логично конечно or, но между группами фильтров мне надо and!
Тогда я снова переписал запрос: SELECT * FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=16 or `t2`.`valueid`=17) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Я уже предвкушал как всё заработает, но нихуя не заработало. Ведь я обращаюсь к единственному параметру, а он не может быть одновременно иметь два и более значений. Помогите запрос составить пожалуйста. Блин, не знаю как объяснить точнее, я тупой хлебушек. Спрашивайте, постараюсь ответить на вопросы
>>225908337 А, я понял всё. Короче, у тебя фильтры построены на айди, которые не могут принимать два значения одновременно. Так переделай фильтры так, чтобы они искали искомый продукт не по айди, а по его параметру, например, цвету. То есть ты сейчас буквально написал:
(товар = 1 или товар = 2) И (товар = 3 или товар = 4)
А нужно так
(товар.цвет = красный или товар.цвет = серобуромалиновый) И (товар.размер = как мой хуй или товар.размер = как жопа моей мамы)
>>225908337 Хочу запросом получить список товаров, удовлетворяющих условиям фильтра.
>Объясни, что ты пытаешься сделать, нормальным языком Не получается почему-то. Вроде головой понимаю, а объяснить не могу. Поэтому структуру таблиц вкинул.
Окей, попробую так. Скриптом я отправляю массив фильтров, например, вот такой массив:
Это фильтр №1 filter[1][0] = 12 - нулевой элемент массива со значением 12 filter[1][1] = 13 - первый элемент массива со значением 13 Это фильтр №2 filter[2][0] = 22 - нулевой элемент массива со значением 22 filter[2][1] = 45 - первый элемент массива со значением 45
Мне надо каким-то боком выдернуть товары, удовлетворяющие этим условиям Как запрос бы построить?
>>225908647 Такое решение мне не походит. Ты предлагаешь список параметров забить жестко в базу, а у меня для каждой категории товаров параметры добавляются динамически, поэтому я для фильтров и их значений сделал отдельные таблицы. СПИСОК ФИЛЬТРОВ ЗАРАНЕЕ НЕ ИЗВЕСТЕН
>>225908931 >Сунь каждому продукту колонок со свойствами и ищи по ним до посинения. Отвечал же: >>225908847
Такое решение мне не походит. Ты предлагаешь список параметров забить жестко в базу, а у меня для каждой категории товаров параметры добавляются динамически, поэтому я для фильтров и их значений сделал отдельные таблицы. СПИСОК ФИЛЬТРОВ ЗАРАНЕЕ НЕ ИЗВЕСТЕН
>>225909151 То есть были условные трусы зелёные, менеджеришка через админку добавил признак лямки и теперь это будут трусы зелёные с лямками? Он руками перехуячивает весь каталог и назначает некоторым товарам новые свойства?
>>225909464 Что-то вроде того. Допустим, завезли к нам носки, а носков мы не продавали. Заводим новую категорию или подкатегорию "носки", в админке для нее добавляем группу фильтров "цвет носка", в нее добавляем признак "цвет носка красный", "цвет носка синий" и "цвет носка зеленый". Потом добавляем еще какие-нибудь группы и признаки к ним. Потом переходим в форму добавления товаров, а там уже будут эти признаки, отсортированные по группам, осталось только галочки поставить.
>>225909761 Сперва я так сделал, потому что отлаживал скрипт. Это работало. Но когда групп фильтров стало больше одной, то меня ждал неприятный сюрприз. Ты задал правильный вопрос. Я вот как раз бьюсь над тем, как это реализовать
>>225910105 >Сделай отдельно таблицу с параметрами, у товаров делай столбец id параметров и столбец значениями Так уже все отдельно, в оп-посте написал. Или ты что-то добавил?
>>225909980 Пиздец, недаром говорят, что на пхп кодят только газонюхи. Там что, какой-то сайт с картинками существует, где умственно отсталых учат престижной профессии? А, ну да, существует, двачем называется. Так вот, >>225910105 всё верно пояснил.
>>225910251 В саму таблицу с товаром, помимо имени добавь id параметров и их значения Тогда ты по сути сможешь напрямую из таблицы товаров дёргать необходимые товары.
Я оч плохо помню бд с вузика, но мне кажется, так логичнее
>>225910603 Хм. Хм-м-м-м-м. Хм! Может быть... может быть... добавить каждому товару список id его параметров и соответствующих им значений, как и было предложено изначально? Да не, хуйня какая-то. Продолжаем дрочить двач.
>>225910811 Окей, покажи как это будет выглядеть в таблице. Как мы можем засунуть в таблицу с товаром список айди, если этот список заранее неизвестен?
>>225907455 (OP) > SELECT FROM `products` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and exists (select from `subproduct_filter_values` where product_id = products.id and valueid in ('14', '88')) and exists (select * from `subproduct_filter_values` where product_id = products.id and valueid in ('OP', 'HUI'))
>>225911190 Есть такая таблица, смотри оп-пост. Проблема не в таблице, а в составлении запроса. Без обид, если у кого не хватило мозгов на прочтение и осознавание оппоста, то проходите мимо. Уж я думал, что тупой, но не думал что тупее меня есть)
>>225911397 Скил задавать вопросы обязателен к прокачке. Мало того, что правильно заданный вопрос содержит половину ответа, так ещё у отвечающего не загорится жопа.
>>225912429 тебе базу надо менять. делаешь связь многое ко многим между фильтрами и продукатами появиться промежуточная таблица в которой 1 товару можно хоть миллион фильтров понаставить и спокойно свой запрос юзаешь вообще ничего не меняя.
>>225912950 Братик, я понимаю, что тебе надо свои анальные боли унять вскукареком напоследок, но лучше не надо, ок? Ты бы смотрелся лучше, кинув напоследок полезную инфу, а не демонстрируя свой кровоточащий от боли пукан
>>225913055 Тебе шибко умному несколько раз написали, что и куда смотреть. Давай мы поищем информацию за тебя, сами изучим и сами сделаем. Устроит такой вариант?
>>225913255 Петушок обиженный, тебя спросить забыли. Иди помажь разодраный пукан зеленкой и ложись спать. Не можешь помочь - заткни свой спермоприемник, без сопливых разберемся)
>>225907455 (OP) Еще раз опиши что ты хочешь получать. Желательно на конкретных примерах. И структуру твоей БД тоже хотелось бы. И примеры данных из всех таблиц.
SELECT * FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=16 or `t2`.`valueid`=17) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Жирным я выделил свою попытку выдрать товары по определенным значениям фильтров. Если фильтры относятся к одной группе, то они перечисляются через OR, и никаких проблем нет. А между группами фильтров я как бы логично поставил операнд AND, но этот запрос не сработал, а потом я сообразил, что запрос идет построчно, и он не может определить принадлежность товара сразу к двум фильтрам из разных групп.
>>225917465 Допустим, есть группа фильтров "цвет" и "размер". Они содержат:
Цвет: Красный id=33 Синий id=32 Зеленый id=31
Размер: S id=19 M id=18 L id=17
Допустим, мы хотим получить красные (id=33) фуболки. Ставим в запрос что-то вроде WHERE `t2`.`valueid`=33 и все норм. Допустим, хотим получить все красные (id=33) и синие (id=32) футболки. Ставим в запрос что-то вроде WHERE (`t2`.`valueid`=32 or `t2`.`valueid`=33) и опять все норм.
До этого наши фильтры относились к одной группе. Как же быть, если они относятся к разным группам?
То есть, допустим, мы хотим получить красные (id=33) и синие (id=32) футболки размером M (id=18). Как в таком случае построить запрос? Вот это - WHERE (`t2`.`valueid`=32 or `t2`.`valueid`=33 or `t2`.`valueid`=18) - будет неверным, т.к. зацепит все красные футболки независимо от размеров, все синие футболки независимо от их размеров и все футболки размером M (которые могут оказаться зелеными). Писать через and? Так это логически неверно. Как быть?
>>225907455 (OP) Чел, единственный совет могу тебе дать: не спрашивай ничего на дваче, по крайней мере в /бэ/ Тут каждый второй погромист 300к/наносек. А когда дело доходит до какой-нибудь задачки простейшей, все эти люди куда-то испаряются и остаются одни дуболомы, которые вопросы с очевидными ответами задают. Не трать время, двачедауны тебе мало чем помогут.
ОП ты какую-то хуйню нагородил, как я понял тебе надо в колонке value отличать разные свойства друг от друга? Ну добавь еще столбец вроде value_type и пиши туда тип значения. И будет у тебя условие: ((t2.valueid=12 or t2.valueid=13) and value_type='color') or ((t2.valueid=19 or t2.valueid=20 or t2.valueid=21) and value_type='smell'). Вообще если у тебя данимический набор полей может тебе лучше использовать какую-нибудь MongoDB?
>>225922056 >((t2.valueid=12 or t2.valueid=13) and value_type='color') or ((t2.valueid=19 or t2.valueid=20 or t2.valueid=21) and value_type='smell'). Прочитай вот >>225917988
>>225922411 Скорее, никто не может. Как-то раз в треде, где все мерялись своими программистскими яйцами и хвастались, что они-де у лягушки хуй видели и комару яйца отстреливали, я вбросил примитивную программистскую задачку, которая решается за 10-15 секунд, ничего замудренного, уровень школы 10 класса. То есть, там не на логику решение, просто банально операторы знать. И что вы думаете? Никто не решил! Все обсирались. Только через три часа под самое закрытие треда нашелся анон, который решил эту школьную задачку. После этого стал ясен уровень местных "икспердов"
>>225922587 ну тут понятно должно быть, что такого количества икспердов на тред в принципе быть не может, вакансии где нужны искперды годами закрываются, что как бы намекает на шанс их появления в случайном треде на дваче
>>225922599 Твоя схема - это мусор, твой предел - верстать визитки, товары у него фильтрами определяются, охуеть истории просто. Для начала научись свои мысли выражать, иначе ничего кроме HTML-программирования тебе не светит. Если вся твоя проблема состоит в динамическом наборе данных, оставляй две своих таблицы products и subproducts и добавляй таблицу properties с полями subproduct_id, property_name, value, джойни с сабпродуктами и ищи че хочешь. Хртьфу
>>225923290 >добавляй таблицу properties с полями subproduct_id, property_name, value Ты предлагаешь почти то же самое, проблема никуда не девается. У тебя не хватает мозгов составить запрос
>>225923235 Тут задача не для эксперта, а банальная джуновская, лол. Тут сотни 300к/наносек, в тредах с зарплатами постоянно кидают скрины доходов, а как доходит до дела, то не могут вбросить решение задачи, которую они уже решали тысячу раз. Странно
>>225923412 нет, я предлагаю тебе выкинуть все твои таблицы кроме 3-х и искать по любому набору полей, если у тебя 3 таблицы заджоинить мозгов не хватает, это твои проблемы, тут не я помощи прошу, а ты, так что иди в пятерочку и не трать чужое время
>>225923518 >если у тебя 3 таблицы заджоинить мозгов не хватает Я так понимаю, ты дальше продолжишь кудахтать и оправдываться, пытаясь скрыть свою тупость? Ну так это ты зря стараешься, мы все видим, что ты туповат и не в состоянии написать этот простой запрос. Можешь сваливать с треда, тебе уже нассали в рот, не захлебнись там)
>>225923489 ну я например 200К чистыми получаю, мне лень что-то делать, какая-то задача непонятная, я бы выносил свойства изначально в отдельные таблицы и джойнил бы по айди, если что надо отобрать, а если всё в одной таблице, я хз, скорее надо кучу вложенных селектов делать
>>225923601 Какой тухлый байт! Только вот просить помощи пришел ты, так что открывай книжечку по sql и начинай читать с самой первой страницы, а я пошел спать, арибидерчи
>>225923642 >я бы выносил свойства изначально в отдельные таблицы Так они вынесены.
>я например 200К чистыми Вот он, пример того самого "иксперда". Он якобы получает 200к, но не может написать простейший запрос. То есть, он не может пройти мимо треда, не может не похвастаться, не может не написать пост, но примитивный запрос написать не может. Он даже суть оп-поста не понял
>>225923765 >суть оп-поста не понял Ну так на двач повыебываться приходят, а не задачи решать, вникнуть в задачу это уже работа, а я работать не хочу, хочу графоманить.
>>225907455 (OP) Слушай, ну если я правильно твою схему бд осознал, то для каждой группы фильтров можно писать ещё один лефт джойн с отдельным алиасом и на него уже условия вешать через или. Можно через in (,,), будет короче запись. Ещё можно тоже по группам собирать запрос, как в первом случае, и каждый объединить через union. А какая у тебя бд? Откуда эти бэкквоты в именах? Сорян, с телефона в 5 утра ппц неудобно печаткать скл.
>>225928255 Я щас не в состоянии с телефона запрос напечатать. В телеге группа есть Обсуждение задач по SQL, напиши туда вопрос, а то тред утонет и печаль. Я завтра очнусь и напишу в ней, как я бы сделал. Ну или кто-то раньше ответит. Задачи там если что ооочень странные, не обращай внимания. И если в состоянии, запили на каком-нибудь sqlfiddle ддл и данные примера, чтобы точно об одном и том же говорить. Окай?
>>225928622 >В телеге группа есть Обсуждение задач по SQL Я постараюсь найти, но может есть ссылка?
>И если в состоянии, запили на каком-нибудь sqlfiddle ддл и данные примера Вот http://sqlfiddle.com/#!9/3a7cbc/1 Так только структура, данные что-то не влезли, я хз
>>225928707 Я признаться хз как с мобильного клиента телеги айди чатика скопировать, там на иконке синяя банка с буквами sql. Прям по названию, она там одна такая.
>>225928890 Вот эта. Да просто вопрос из оппоста туда напиши и ссулку на фиддл тоже добавь. Там два с половиной человека раз в три дня что-то пишут, вопрос точно не потеряется.
>>225929135 А, сорян, это не отдельная группа, а обсуждалка от канала sqlquestions сначала к каналу, потом через дискасс в эту. У самой группы адреса походу нет.
>>225929292 Да там бот какой-то постит вопросы по мсскл от которых у всех жопа горит. А так кто-то что-то бывает спрашивает, какой-нибудь мимокрокодил ответит, бывает даже по делу.
>>225929441 Да плохо сформулированные, без указания рсубд или настолько примитивные, что такое, наверное в шараге на курсе по аксесу не спросят никогда. Примерно как в том анекдоте про "сила тока измеряется в амперах: да есть и так точно"
Пишу свой простенький фильтр для интернет магазина. Помогите пожалуйста с запросом.
Для начала опишу упрощенно структуру БД. Не обращайте внимания на некоторую избыточность, это сделано для упрощения запросов. Таблицы разбил по группам, чтобы выделить жирным отдельные поля, которые значат одно и то же.
products - id, name - таблица с товарами
subproducts - id, productid, price - таблица подтоваров. Просто у меня в один товар входит несколько подтоваров, каждый может иметь свою цену и определяется по количеству фильтров
filters - id, name - таблица с группой фильтров. Этой таблицей мы характеризуем группу фильтров, например, "цвет"
filter_parameters - id, filterid, value - это конкретно сами фильтры, разбитые по группам и имеющие значения
subproduct_filter_values - id, productid, subproductid, valueid - это таблица, которая в себе связывает айди подтовара с айди фильтра.
Сперва я сделал вот такой запрос (выделил жирным часть запроса с фильтрами):
SELECT FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=20 or `t2`.`valueid`=21) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
И мне показалось, что работает. Но потом я отправил запрос, добавив ещё фильтр:
SELECT FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=12 or `t2`.`valueid`=13 or `t2`.`valueid`=19 or `t2`.`valueid`=20 or `t2`.`valueid`=21) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Видите, там фильтры перебираются через условия or? Если фильтры относятся к одной группе, то логично конечно or, но между группами фильтров мне надо and!
Тогда я снова переписал запрос:
SELECT * FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=16 or `t2`.`valueid`=17) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Я уже предвкушал как всё заработает, но нихуя не заработало. Ведь я обращаюсь к единственному параметру, а он не может быть одновременно иметь два и более значений. Помогите запрос составить пожалуйста. Блин, не знаю как объяснить точнее, я тупой хлебушек. Спрашивайте, постараюсь ответить на вопросы