Выборка по точным вхождениям

240
12 мая 2017, 15:30

Реализована возможность динамического создания полей характеристик для товара. Задача: Сделать фильтр по характеристикам. Почти все сделал. Но есть одна проблемка. Выводит товары в характеристиках которых, есть хотя бы одно совпадение. То есть, если я выбираю АВТО - выводит все товары которые являются АВТО, потом я выбираю КРАСНЫЕ - выводит опять же все товары АВТО + КРАСНЫЕ. А, например, АВТО СИНИЕ выводятся тоже.

Запрос:

$item = mysql_query("SELECT DISTINCT `id_item` FROM `x-ka` WHERE (id_pole, value) in ($in)");

Где in - значения, которые создаются при запросе, так как заранее нельзя определить все возможные поля характеристик.

Буду благодарен за любую полезную информацию.

Answer 1
SELECT `id_item` 
FROM `x-ka` 
WHERE (id_pole, value) in ($in)
GROUP BY `id_item` 
HAVING COUNT(`id_item`) = $pairs_count_in_$in
Answer 2

судя по описанию, у вас все характеристики — в одной таблице. и в ней явно присутствует ещё и идентификатор товара.

значит, для выборки идентификаторов товаров, у которых совпадают характеристики, надо использовать объединения (join).

вот ориентировочные примеры для двух и трёх совпадающих характеристик:

SQL Fiddle

MySQL 5.6 Schema Setup:

create table x (id int, tovar int, name text);
insert into x (id, tovar, name) values
  (0, 1, 'авто')
 ,(1, 1, 'красные')
 ,(2, 1, 'длинные')
 ,(3, 2, 'авто')
 ,(4, 2, 'синие')
 ,(5, 2, 'длинные')
 ,(6, 3, 'авто')
 ,(7, 3, 'красные')
 ,(8, 3, 'короткие')
;

Query 1:

/* для двух характеристик */
select x1.tovar from x x1
left join x x2 on
 x2.tovar = x1.tovar and x2.id <> x1.id
where
 x1.name = 'авто' and x2.name = 'красные'

Results:

| tovar |
|-------|
|     1 |
|     3 |

Query 2:

/* для трёх характеристик */
select x1.tovar from x x1
left join x x2 on
 x2.tovar = x1.tovar and x2.id <> x1.id
left join x x3 on
 x3.tovar = x1.tovar and x3.id <> x1.id
where
 x1.name = 'авто' and x2.name = 'красные' and x3.name = 'длинные'

Results:

| tovar |
|-------|
|     1 |
READ ALSO
Проставить изначальный zoom

Проставить изначальный zoom

Работаю с картами, как изначально проставить zoom(примерно так, чтоб было видно только тот город, в котором расположены эти маркеры)?

280
Взаимодействие между *.java-классами

Взаимодействие между *.java-классами

Всем приветЯ новичок в андроиде, поэтому много чего еще не понимаю

248
Как читать посимвольно из textarea в java

Как читать посимвольно из textarea в java

Как читать посимвольно из textarea сразу после введение символов в textarea в java? те

427
404 description The requested resource is not available

404 description The requested resource is not available

ПриветствуюПодскажите такой вопрос

415