2015-07-08 3 views
0

Я создал запрос, который возвращает список продуктов с их полями и значениями. Теперь я хочу выполнить поиск по полям для определенного значения и получить список результатов, соответствующий этому поисковому запросу. Проблема в том, что я хочу конструкцию AND, поэтому значение fieldx должно быть как% car%, а полевое значение должно быть как% chrome%.Запрос фильтра Mysql (AND) для нескольких полей в нескольких соединенных строках

Здесь `s пример моего запроса и ResultSet:

Запроса

SELECT p.id as product,pf.field_name,pfv.field_value 
FROM product p 
JOIN field pf ON pf.product_id = p.product_id 
JOIN field_val pfv ON pfv.field_id = pf.field_id 

Resultset

product | field_name | field_value 
pr1  | meta_title | Example text 
pr1  | meta_kw | keyword,keyword1 
pr1  | prod_name | Product 1 
pr2 .... 

Так с вышеупомянутым запросом и результирующим в виде I хочу сделать следующее: Запросить все продукты, в которых meta_title co ntains 'Example' и где prod_name содержит 'Product'. После этого я хочу сгруппировать результаты, чтобы возвращались только те продукты, в которых совпадают оба поисковых запроса.

Я пробовал все, что мог придумать, и я пробовал много решений по одному и тому же вопросу, но, по-моему, у меня разные, потому что мне нужно совпадение И по имени поля, а также значение по нескольким строкам.

Например, я попробовал, добавив это как ИНЕКЕ:

WHERE 
(field_name = 'meta_title' AND field_value LIKE '%Example%') AND 
(field_name = 'prod_name' AND field_value LIKE '%Product%') 

Очевидно, что эта работа, потому что выигранное `t после того, как первый, где на meta_title нет результата осталось других имен полей. Но изменение ГДЕ к ИЛИ не дало бы мне желаемого результата.

Я также пробовал с HAVING, но похоже на тот же результат.

Кто-нибудь знает, как решить это, или это просто невозможно?

ответ

0

относительно простой способ сделать это состоит в использовании group by и having:

SELECT p.id as product 
FROM product p JOIN 
    field pf 
    ON pf.product_id = p.product_id JOIN 
    field_val pfv 
    ON pfv.field_id = pf.field_id 
WHERE (field_name = 'meta_title' AND field_value LIKE '%Example%') OR 
     (field_name = 'prod_name' AND field_value LIKE '%Product%') 
GROUP BY p.id 
HAVING COUNT(DISTINCT field_name) = 2; 

Изменяя положение HAVING (и, возможно, удаляя WHERE), то можно выразить множество разных логик для присутствия и отсутствия разных полей. Например, > 0 будет OR, а = 1 будет одним из значений, но не обоих.

+0

Отлично! Работает как шарм и имеет смысл. Я не думал о комбинации «Имея с« Где », что фактически заставляет его действовать как оператор И. Благодаря! – user1281146

0

Попробуйте это:

select product from [table_name] 
    WHERE field_name like 'meta_title' AND field_value LIKE '%Example%' 

UNION 

select product from [table_name] 
    WHERE field_name like 'prod_name' AND field_value LIKE '%Product%' 
+0

Спасибо, я на самом деле думаю, из этого ранее, но причина, по которой я не хотел использовать это, заключается в том, что запрос сейчас очень мал, но в итоге станет намного больше, поскольку поисковый запрос может распространяться на 15 полей. Тогда это был бы уродливый большой запрос со многими профсоюзами. Спасибо, в любом случае! – user1281146

0

Во-первых: я бы выбрал самый простой способ. Если решение Prerak Solas работает, и производительность в порядке для вас, пойдите для этого.

Другое решение - использовать сводную таблицу.С этим выбрать из вашей таблицы будет возвращать что-то вроде этого:

product | meta_title | meta_kw   | prod_name 
pr1  | Example text | keyword,keyword1 | Product 1 
pr2 ... 

Вы могли бы, чем просто запрос типа:

SELECT 
    p.Id 
FROM 
    (subquery/view) 
WHERE 
    meta_title LIKE '%Example%' AND 
    prod_name LIKE '%Product%' 

Для более подробной информации о сводном чтении this

+0

Спасибо, но я использовал решение Gordon, я, возможно, проведу разницу в производительности между предлагаемыми решениями, но на данный момент решение для меня наиболее легко реализовать. – user1281146