1

私がやろうとしていることが可能かどうかはわかりませんが、必要な解決策を得るためにさまざまな方法を試してきましたが、これまでのところ手ぶらでやってきました。

2つのテーブルがあるとしましょう(単なる例です。私の場合、さらに多くのデータがあります)

1 つは client と呼ばれ、もう 1 つは form_data と呼ばれます。client テーブルには複数のクライアントがあり、form_data テーブルには、clients テーブルに存在する会社ごとに複数の行があります。form_data には、さまざまなフォームからシリアル化されたデータを格納します。(IDとデータ)

現在、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

クエリは教義クエリからのものです。

編集: form_data テーブルに 10 のフォームを持つ会社がある場合、「モーター オイル」でフィルタリングすると、モーター オイルを持たないその会社のすべてのフォームが削除されます。したがって、会社 ID 144 の 10 のフォームのうちの 1 つだけの場合エンジンオイルという単語があり、他の9つのフォームはクエリで失われます..それらを保持したい. 私が望むのは、その一致するフォーム (モーター オイル) が見つからなかった会社は、すべてのフォームを検索から削除することです。

4

4 に答える 4

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%'

適切なフィルターを使用して、フォーム テーブルから関連する行を選択する任意のクエリを配置できます。

左外部結合 where null テクニックを使用して逆のこともできます..ただし、この場合、サブクエリを変更して個別のクライアントのリストを返すと、おそらく期待どおりの結果が得られます。

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
于 2012-04-24T08:56:59.040 に答える
1

検索に一致するフォームを少なくとも 1 つ持っているすべての顧客のすべてのフォーム データ:

SELECT * FROM `form_data`
WHERE `clientid` IN (
  SELECT DISTINCT `clientid` FROM `form_data`
  WHERE `data` RLIKE '[[:<:]]motor oil[[:>:]]'
);
于 2012-04-24T09:02:56.177 に答える
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[[:>:]]'
于 2012-04-24T08:55:23.900 に答える
0

よくわからない 一致する企業のすべてのフォームを表示し続けるとはどういう意味ですか? これだけではありません...

select * from clients inner join form_data on clients.id = form_data.id where form_data.[data] like '%motor  oil%'
于 2012-04-24T08:53:08.520 に答える