【问题标题】:SQL Query filtering adviceSQL 查询过滤建议
【发布时间】:2012-04-24 08:48:14
【问题描述】:

我不确定我想要做的事情是否可行,但我一直在尝试用不同的方法来解决我需要的解决方案,但到目前为止我空手而归。

假设我有 2 个表(只是一个例子,在我的例子中,还有更多 + 更多数据)

一个叫做clients,另一个叫做form_data。 我们在 clients 表中有多个客户,在 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 个具有word motor oil 然后其他 9 种形式在查询中丢失了。我想保留它们。我想要的是任何没有找到与该匹配项(机油)匹配的表格的公司,将其所有表格从搜索中删除。

【问题讨论】:

  • 请不要犹豫发布您的查询。如果它很长,人们就不会读它(这总比没有它好)
  • 还显示您的表的示例数据,以了解我们处理的数据的类型(文本、xml、int、..etc)
  • 更好的是,将架构和查询放在sqlfiddle
  • 另外,如果您有一家公司在 1 行中使用“机油”而不在其他行中,您是要显示 1 行还是完全忽略该公司?

标签: mysql sql doctrine


【解决方案1】:

至少有一个与搜索匹配的表单的所有客户的所有表单数据:

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

【讨论】:

  • 这正是我想要的,谢谢
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    不确定 为匹配的公司保留所有表单是什么意思? 不只是得到这个......

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

    【讨论】:

      【解决方案4】:

      这将返回为名称中也包含“机油”的公司填写的所有包含“机油”的表格:

      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[[:>:]]'
      

      【讨论】:

        猜你喜欢
        • 2013-12-27
        • 2016-09-11
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2012-06-28
        相关资源
        最近更新 更多