2012-04-24 4 views
1

Я не уверен, что я пытаюсь сделать это возможно, но я пытался использовать разные методы для решения, которое мне нужно, но до сих пор я пришел с пустыми руками.Совет по фильтрации запросов SQL

Допустим, у меня есть 2 таблицы (только пример, в моем случае Theres ад намного больше + много больше данных)

Один называется клиентов и другой под названием form_data. У нас есть несколько клиентов в таблице клиентов, а в таблице form_data у нас есть несколько строк для каждой компании, присутствующей в таблице клиентов. В form_data хранятся сериализованные данные из разных форм. (id и data)

В настоящее время я извлекаю все записи из таблицы form_data, и я пытаюсь использовать регулярное выражение в столбце данных, чтобы, например, фильтровать, что в них найдено значение «моторное масло».

Я хотел бы сделать этот фильтр, но фильтровать компанию, а не формы. Поэтому я хочу найти формы, в которых есть «моторное масло», и удалить все записи для КОМПАНИЙ, которые не имеют этот матч, но я хочу, чтобы все формы отображались для компаний, которые соответствуют.

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

Привет

РЕДАКТИРОВАТЬ:

SELECT f.form_question_has_answer_id AS f__form_question_has_answer_id, f.form_question_has_answer_request AS f__form_question_has_answer_request, 
f.form_question_has_answer_form_id AS f__form_question_has_answer_form_id, f.form_question_has_answer_user_id AS f__form_question_has_answer_user_id, 
p.project_company_has_user_id AS p__project_company_has_user_id, p.project_company_has_user_project_id AS p__project_company_has_user_project_id, 
p.project_company_has_user_user_id AS p__project_company_has_user_user_id, c.company_id AS c__company_id, c.company_hall_no AS c__company_hall_no, 
c.company_type AS c__company_type, c.company_company_name AS c__company_company_name, c.company_country AS c__company_country, 
c.company_stand_number AS c__company_stand_number, c.company_image_file_1 AS c__company_image_file_1, p2.project_id AS p2__project_id, 
p2.project_name AS p2__project_name, u.user_id AS u__user_id, u.user_username AS u__user_username, f2.form_id AS f2__form_id 
FROM form_question_has_answer f 
INNER JOIN project_company_has_user p ON f.form_question_has_answer_user_id = p.project_company_has_user_user_id 
INNER JOIN company c ON p.project_company_has_user_company_id = c.company_id 
INNER JOIN project p2 ON p.project_company_has_user_project_id = p2.project_id 
INNER JOIN user u ON p.project_company_has_user_user_id = u.user_id 
INNER JOIN form f2 ON p.project_company_has_user_project_id = f2.form_project_id 
WHERE f.form_question_has_answer_id IN ('19262', '21560', '23088', '22660', '14772', '18495', '18720', '21625', '19957', '20943') 
AND ((f2.form_template_name = "custom" AND p.project_company_has_user_garbage_collection = 0 AND p.project_company_has_user_project_id = 29) AND f.form_question_has_answer_request REGEXP 'item-cadcae') 
ORDER BY company_company_name asc 

Этот запрос из запроса доктрины.

EDIT: Если у меня есть компания с 10 формами в таблице form_data, если я фильтрую «моторное масло», все формы для этой компании, у которых нет моторного масла, удаляются .. так что если только 1 из 10 формы для компании id 144 имеют слово моторное масло, тогда остальные 9 форм теряются в запросе. Я хочу их сохранить. Я хочу, чтобы любая компания, которая не нашла каких-либо форм с этим соответствием (моторное масло), чтобы удалить все формы из поиска.

+4

Пожалуйста, не стесняйтесь, разместите ваш запрос. Если он длинный, люди просто его не прочитают (что лучше, чем не иметь его вообще) – Quassnoi

+1

Также покажите образцы данных своих таблиц, чтобы узнать тип (текст, xml, int и т. Д.) Данных, с которыми мы имеем дело –

+1

Еще лучше, поместите схему и запрос в [sqlfiddle] (http://sqlfiddle.com/). – eggyal

ответ

1

Все данные формы для всех клиентов, у которых есть хотя бы одна форма, которая подходит к поиску:

SELECT * FROM `form_data` 
WHERE `clientid` IN (
    SELECT DISTINCT `clientid` FROM `form_data` 
    WHERE `data` RLIKE '[[:<:]]motor oil[[:>:]]' 
); 
+0

Это именно то, что я хотел, спасибо – mr12086

0

Не уверен. Что вы подразумеваете под тем, чтобы все формы отображались для компаний, которые соответствуют? не просто получать на это ...

select * from clients inner join form_data on clients.id = form_data.id where form_data.[data] like '%motor oil%' 
0

Это будет возвращать все формы с «моторным маслом» в них заполненные для компаний, которые также имеют «моторное масло» в их названии:

SELECT * 
FROM clients c 
JOIN form_data fd 
ON  fd.client = c.id 
WHERE fd.data RLIKE '[[:<:]]motor oil[[:>:]]' 
     AND c.name RLIKE '[[:<:]]motor oil[[:>:]]' 
1
SELECT 
    c.* 
FROM 
    clients as c 
    INNER JOIN (
     select 
      * 
     from 
      forms 
     where 
      sometext like '%motor oil%' 
     ) as f 
     ON f.client = c.id 

http://sqlfiddle.com/#!3/5b616/1

в этой части:

select 
    * 
from 
     forms 
where 
     sometext like '%motor oil%' 

вы можете поместить любой запрос, который выбирает соответствующие строки из таблицы форм с соответствующими фильтрами.

вы можете сделать инверсию тоже с левым внешним соединением, где нулевая техника ..хотя в этом случае изменения подзапрос возвращает список различных клиентов, вероятно, даст вам больше, как результаты, которые вы ожидаете:

SELECT 
    c.* 
FROM 
    clients as c 
    LEFT OUTER JOIN (
     select 
      distinct 
       client 
     from 
      forms 
     where 
      sometext like '%motor oil%' 
     ) as f 
     ON f.client = c.id 
where f.client is null 

http://sqlfiddle.com/#!3/5b616/4

так с чем-то запроса, как:

SELECT 
    c.* 
FROM 
    company AS c 
    INNER JOIN (
       SELECT 
        DISTINCT c.company_id 
       FROM 
        form_question_has_answer f 
        INNER JOIN project_company_has_user p 
         ON f.form_question_has_answer_user_id = p.project_company_has_user_user_id 
        INNER JOIN company c 
         ON p.project_company_has_user_company_id = c.company_id 
        INNER JOIN project p2 
         ON p.project_company_has_user_project_id = p2.project_id 
        INNER JOIN user u 
         ON p.project_company_has_user_user_id = u.user_id 
        INNER JOIN form f2 
         ON p.project_company_has_user_project_id = f2.form_project_id 
       WHERE 
        f.form_question_has_answer_id IN ('19262', '21560', '23088', '22660', '14772', '18495', '18720', '21625', '19957', '20943') 
        AND ((f2.form_template_name = "custom" 
        AND p.project_company_has_user_garbage_collection = 0 
        AND p.project_company_has_user_project_id = 29) 
        AND f.form_question_has_answer_request REGEXP 'item-cadcae') 
       ORDER BY company_company_name asc 
      ) as f 
       ON f.company_id= c.id