Сап, программач.Пишу свой простенький фильтр для интернет магазина. Помогите пожалуйста с запросом.Для начала опишу упрощенно структуру БД. Не обращайте внимания на некоторую избыточность, это сделано для упрощения запросов. Таблицы разбил по группам, чтобы выделить жирным отдельные поля, которые значат одно и то же.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Я уже предвкушал как всё заработает, но нихуя не заработало. Ведь я обращаюсь к единственному параметру, а он не может быть одновременно иметь два и более значений. Помогите запрос составить пожалуйста. Блин, не знаю как объяснить точнее, я тупой хлебушек. Спрашивайте, постараюсь ответить на вопросы
>>225907455 (OP)Нахуй ты на голом SQL пишешь? На чем там этот твой интернет-магазин? Разве там нет какой-нибудь ORM?>( `t2`.`valueid`=16 or `t2`.`valueid`=17) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34)> (x = a or x = b) and (x = c or x = d)Это же противоречивое условие, как так вышло, током ебнуть? Перестань думать в терминах фильтров и думай в терминах предикатов.
>>225907804>Нахуй ты на голом SQL пишешь? На чем там этот твой интернет-магазин? Разве там нет какой-нибудь ORM?На пыхе пишу.>Это же противоречивое условие, как так вышло, током ебнуть?Ну вот так. Как исправить? :с
Объясни, что ты пытаешься сделать, нормальным языком, и я, так и быть, подскажу.нихуя не шарю в порнографировании, но ущербную логику вижу
>>225908337А, я понял всё. Короче, у тебя фильтры построены на айди, которые не могут принимать два значения одновременно. Так переделай фильтры так, чтобы они искали искомый продукт не по айди, а по его параметру, например, цвету. То есть ты сейчас буквально написал:(товар = 1 или товар = 2) И (товар = 3 или товар = 4)А нужно так(товар.цвет = красный или товар.цвет = серобуромалиновый) И (товар.размер = как мой хуй или товар.размер = как жопа моей мамы)
>>225908337Хочу запросом получить список товаров, удовлетворяющих условиям фильтра. >Объясни, что ты пытаешься сделать, нормальным языкомНе получается почему-то. Вроде головой понимаю, а объяснить не могу. Поэтому структуру таблиц вкинул.Окей, попробую так. Скриптом я отправляю массив фильтров, например, вот такой массив:Это фильтр №1filter[1][0] = 12 - нулевой элемент массива со значением 12filter[1][1] = 13 - первый элемент массива со значением 13Это фильтр №2filter[2][0] = 22 - нулевой элемент массива со значением 22filter[2][1] = 45 - первый элемент массива со значением 45Мне надо каким-то боком выдернуть товары, удовлетворяющие этим условиям Как запрос бы построить?
>>225908647Такое решение мне не походит. Ты предлагаешь список параметров забить жестко в базу, а у меня для каждой категории товаров параметры добавляются динамически, поэтому я для фильтров и их значений сделал отдельные таблицы. СПИСОК ФИЛЬТРОВ ЗАРАНЕЕ НЕ ИЗВЕСТЕН
>>225907455 (OP)Какое-то говно из жопы, фильтры, хуильтры, что ты несёшь?Сунь каждому продукту колонок со свойствами и ищи по ним до посинения.
>>225908931>Сунь каждому продукту колонок со свойствами и ищи по ним до посинения.Отвечал же: >>225908847Такое решение мне не походит. Ты предлагаешь список параметров забить жестко в базу, а у меня для каждой категории товаров параметры добавляются динамически, поэтому я для фильтров и их значений сделал отдельные таблицы. СПИСОК ФИЛЬТРОВ ЗАРАНЕЕ НЕ ИЗВЕСТЕН
>>225909151То есть были условные трусы зелёные, менеджеришка через админку добавил признак лямки и теперь это будут трусы зелёные с лямками?Он руками перехуячивает весь каталог и назначает некоторым товарам новые свойства?
>>225909464Что-то вроде того. Допустим, завезли к нам носки, а носков мы не продавали. Заводим новую категорию или подкатегорию "носки", в админке для нее добавляем группу фильтров "цвет носка", в нее добавляем признак "цвет носка красный", "цвет носка синий" и "цвет носка зеленый". Потом добавляем еще какие-нибудь группы и признаки к ним. Потом переходим в форму добавления товаров, а там уже будут эти признаки, отсортированные по группам, осталось только галочки поставить.
>>225909761Сперва я так сделал, потому что отлаживал скрипт. Это работало. Но когда групп фильтров стало больше одной, то меня ждал неприятный сюрприз. Ты задал правильный вопрос. Я вот как раз бьюсь над тем, как это реализовать
>>225909151Сделай отдельно таблицу с параметрами, у товаров делай столбец id параметров и столбец значениямиСобственно будешь отсеивать товары по id параметра, а потом по значениюУверен что это можно как-то грамотно организовать
>>225910105>Сделай отдельно таблицу с параметрами, у товаров делай столбец id параметров и столбец значениямиТак уже все отдельно, в оп-посте написал. Или ты что-то добавил?
>>225909980Пиздец, недаром говорят, что на пхп кодят только газонюхи. Там что, какой-то сайт с картинками существует, где умственно отсталых учат престижной профессии? А, ну да, существует, двачем называется. Так вот, >>225910105 всё верно пояснил.
>>225910261В добавлении айди параметра вроде какое-то рациональное зерно есть... Только понять бы как это в запрос впихнуть
>>225910251В саму таблицу с товаром, помимо имени добавь id параметров и их значенияТогда ты по сути сможешь напрямую из таблицы товаров дёргать необходимые товары.Я оч плохо помню бд с вузика, но мне кажется, так логичнее
>>225910603Хм. Хм-м-м-м-м. Хм! Может быть... может быть... добавить каждому товару список id его параметров и соответствующих им значений, как и было предложено изначально? Да не, хуйня какая-то. Продолжаем дрочить двач.
>>225910811Окей, покажи как это будет выглядеть в таблице. Как мы можем засунуть в таблицу с товаром список айди, если этот список заранее неизвестен?
>>225910881чел, через запятую перечисли несколько айди, жсоном, чемнить ещёТогда заведи отдельную таблицу со значениями параметровId - tovarid - paramid - paramvalueПолучай из нее айди товаров по подходящим параметрам
>>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Есть такая таблица, смотри оп-пост. Проблема не в таблице, а в составлении запроса. Без обид, если у кого не хватило мозгов на прочтение и осознавание оппоста, то проходите мимо. Уж я думал, что тупой, но не думал что тупее меня есть)
Это тред помощи с программированием? Помогите и мне тоже. Не работает код на джаве:int 1 = 2;system.out.println(1);Сменить имя переменной не предлагать.
>>225911397Скил задавать вопросы обязателен к прокачке.Мало того, что правильно заданный вопрос содержит половину ответа, так ещё у отвечающего не загорится жопа.
>>225907455 (OP)И вообще сделал бы модель нормальную в разы быстрее бы дело пошло, вот делать не хуй сидеть в тонну строк вникать, че там понаписано.
>>225907455 (OP)Бля, ты же недели две назад уже срал этой хуйней, может делом займёшься, вместо этого?
>>225912429тебе базу надо менять. делаешь связь многое ко многим между фильтрами и продукатами появиться промежуточная таблица в которой 1 товару можно хоть миллион фильтров понаставить и спокойно свой запрос юзаешь вообще ничего не меняя.
>>225912344Хорошо братик, буду обиженкой, а ты дальше глупи на простых вещах.С кривой архитектурой БД и 0 базовых знаний в их проектировании.
>>225912950Братик, я понимаю, что тебе надо свои анальные боли унять вскукареком напоследок, но лучше не надо, ок? Ты бы смотрелся лучше, кинув напоследок полезную инфу, а не демонстрируя свой кровоточащий от боли пукан
>>225912809Просто добовляеш еще 1 промежуточную таблицу в которой будет id товара и id фильтров и делаешь запрос на этой таблицеhttp://jtest.ru/bazyi-dannyix/sql-dlya-nachinayushhix-chast-3.html
>>225913055Тебе шибко умному несколько раз написали, что и куда смотреть.Давай мы поищем информацию за тебя, сами изучим и сами сделаем. Устроит такой вариант?
>>225913255Петушок обиженный, тебя спросить забыли. Иди помажь разодраный пукан зеленкой и ложись спать. Не можешь помочь - заткни свой спермоприемник, без сопливых разберемся)
>>225907455 (OP)Еще раз опиши что ты хочешь получать. Желательно на конкретных примерах. И структуру твоей БД тоже хотелось бы. И примеры данных из всех таблиц.
>>225915381Вот мой последний запрос: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, но этот запрос не сработал, а потом я сообразил, что запрос идет построчно, и он не может определить принадлежность товара сразу к двум фильтрам из разных групп.
>>225907455 (OP)> Я уже предвкушал как всё заработает, но нихуя не заработало. Ты туповат, смени сферу деятельности.
>>225917465Допустим, есть группа фильтров "цвет" и "размер". Они содержат:Цвет:Красный id=33Синий id=32Зеленый id=31Размер:S id=19M id=18L 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? Так это логически неверно. Как быть?
>>225917988WHERE ((`t2`.`valueid`=32 and `t2`.`valueid`=18) or (`t2`.`valueid`=33 and `t2`.`valueid`=18))
>>225918190>`t2`.`valueid`=32 and `t2`.`valueid`=18Как у тебя одно и то же поле может содержать сразу два значения?
>>225918252Вот именно почему тебя в одной таблице разные свойства.....Делай тогда два запроса и из них третий.
>>225918454Не обслуживаешь, но языком чесать любишь? Так и скажи, что ничего не понял. Обоссан, свободен)
>>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к, но не может написать простейший запрос. То есть, он не может пройти мимо треда, не может не похвастаться, не может не написать пост, но примитивный запрос написать не может. Он даже суть оп-поста не понял
>>225923751Конкретно у тебя ничего не просят. Тебе нассали в рот, можешь идти спать, ток не сглатывай))
>>225923765>суть оп-поста не понялНу так на двач повыебываться приходят, а не задачи решать, вникнуть в задачу это уже работа, а я работать не хочу, хочу графоманить.
>>225907455 (OP)Ебать, я только что с удовольствием просмотрел видео с тик-тока.Чего только не случается.
>>225907455 (OP)Судя по вопросу, ты только начал изучать бд. Айти пузырь скоро лопнет, еблан, беги от туда.
>>225907455 (OP)Слушай, ну если я правильно твою схему бд осознал, то для каждой группы фильтров можно писать ещё один лефт джойн с отдельным алиасом и на него уже условия вешать через или. Можно через in (,,), будет короче запись. Ещё можно тоже по группам собирать запрос, как в первом случае, и каждый объединить через union.А какая у тебя бд? Откуда эти бэкквоты в именах?Сорян, с телефона в 5 утра ппц неудобно печаткать скл.
>>225928255Я щас не в состоянии с телефона запрос напечатать. В телеге группа есть Обсуждение задач по SQL, напиши туда вопрос, а то тред утонет и печаль. Я завтра очнусь и напишу в ней, как я бы сделал. Ну или кто-то раньше ответит.Задачи там если что ооочень странные, не обращай внимания.И если в состоянии, запили на каком-нибудь sqlfiddle ддл и данные примера, чтобы точно об одном и том же говорить.Окай?
>>225928622>В телеге группа есть Обсуждение задач по SQLЯ постараюсь найти, но может есть ссылка?>И если в состоянии, запили на каком-нибудь sqlfiddle ддл и данные примераВот http://sqlfiddle.com/#!9/3a7cbc/1Так только структура, данные что-то не влезли, я хз
>>225928707Я признаться хз как с мобильного клиента телеги айди чатика скопировать, там на иконке синяя банка с буквами sql. Прям по названию, она там одна такая.
>>225928858Я хз какую-то группу нашел, но не понятно как там писать вопросы и как потом искать решение, если я отойду
>>225928890Вот эта.Да просто вопрос из оппоста туда напиши и ссулку на фиддл тоже добавь. Там два с половиной человека раз в три дня что-то пишут, вопрос точно не потеряется.
>>225929135А, сорян, это не отдельная группа, а обсуждалка от каналаsqlquestionsсначала к каналу, потом через дискасс в эту. У самой группы адреса походу нет.
>>225929292Да там бот какой-то постит вопросы по мсскл от которых у всех жопа горит.А так кто-то что-то бывает спрашивает, какой-нибудь мимокрокодил ответит, бывает даже по делу.
>>225929373>Да там бот какой-то постит вопросы по мсскл от которых у всех жопа горит.А что за вопросы, чего жопа-то горит?
>>225929441Да плохо сформулированные, без указания рсубд или настолько примитивные, что такое, наверное в шараге на курсе по аксесу не спросят никогда. Примерно как в том анекдоте про "сила тока измеряется в амперах: да есть и так точно"