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'ы на каждый вариант параметра?
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ответы на вопрос 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 признак имеется, соответсвующий бит добавляется в сумму, если нет, то не добавляется. К получившемуся результату применить фильтр по битовой маске.
Еще буитовую сумму можно хранить перманентно, чтобы ее проиндексировать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы