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'ы на каждый вариант параметра?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
возможно некорректный запрос

угу. ci.char_id = 1 AND ci.char_id = 2. не бывает так, чтобы одновременно было равно и единице и двойке.

Как сделать правильный запрос? join'ы на каждый вариант параметра?

да. только не нужен left, нужен
JOIN <tablename> ON (тут свяжите таблицы по ид товара + условие ид характеристики)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
john36allTa
@john36allTa
That`s calling Walker
По моему можно сделать что то вроде
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
Ответ написан
TheRonCronix
@TheRonCronix
Можно сопоставить каждому char_id бит в битовом поле, который хранить в chars.
После соединения item и charsItems нужно провести агрегацию с суммированием битовых значений для каждого item. Если у item признак имеется, соответсвующий бит добавляется в сумму, если нет, то не добавляется. К получившемуся результату применить фильтр по битовой маске.
Еще буитовую сумму можно хранить перманентно, чтобы ее проиндексировать.
Ответ написан
Ваш ответ на вопрос

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

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