carlcox
@carlcox
Fullstack developer

Как сделать запрос с несколькими условиями по одному столбцу?

Имеется таблица связывающая товары и характеристики. Поля связывающей таблицы (id, char_id, item_id)

Пример: 1, 2, 3 -> (1 - id AI, 2 - id характеристики в другой таблице (пр. цвет красный), 3 - id товара в таблице товаров)
соответственно в таблице во втором столбце могут быть разные id в соответствии с различными характеристиками, а в третьем могут быть одинаковые id товара, т.к. у товара может быть несколько характеристик.

Суть вопроса.
Имеется фильтр, по которому выводятся товары, например, юзер выбрал красный цвет
Делая запрос
$mysqli->query("SELECT it.id FROM charsItems ci
        LEFT JOIN items it ON it.id = ci._item.id
        WHERE ci.char_id = 1");


я получаю все товары с красным цветом, но если выбрать ещё 1 параметр например цена, то при добавлении AND:
$mysqli->query("SELECT it.id FROM charsItems ci
        LEFT JOIN items it ON it.id = ci._item.id
        WHERE ci.char_id = 1 AND ci.char_id = 2");

не выводятся уже ничего, возможно некорректный запрос.
Как сделать правильный запрос? join'ы на каждый вариант параметра?
  • Вопрос задан
  • 276 просмотров
Пригласить эксперта
Ответы на вопрос 3
john36allTa
@john36allTa
alien glow of a dirty mind
По моему можно сделать что то вроде
SELECT * FROM (
   SELECT it.id FROM charsItems ci
    LEFT JOIN items it ON it.id = ci._item.id
    WHERE ci.char_id = 1
) AS T1
WHERE price < 2000
Ответ написан
syamskoy
@syamskoy
Не знаю на сколько правильно понял вопрос, но вроде так: https://www.db-fiddle.com/f/PoHgzumaKhBpX6GT4MCMv/0
Ответ написан
Комментировать
TheRonCronix
@TheRonCronix
Можно сопоставить каждому char_id бит в битовом поле, который хранить в chars.
После соединения item и charsItems нужно провести агрегацию с суммированием битовых значений для каждого item. Если у item признак имеется, соответсвующий бит добавляется в сумму, если нет, то не добавляется. К получившемуся результату применить фильтр по битовой маске.
Еще буитовую сумму можно хранить перманентно, чтобы ее проиндексировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы