1

我需要一些关于一起使用 LIKE 和 NOT LIKE 的帮助...我有一个查询,我根据我的请求变量来自另一台服务器的内容传递 WHERE 子句。其中一个查询如下所示:

    'CONNECT' =>
    "( detail_head.comment LIKE '%port%'
      or detail_head.comment LIKE '%forward%'
      or detail_head.comment LIKE '%connect%'
      or detail_head.comment LIKE '%router%'
      or detail_head.comment LIKE '%fire%wall%'
      or detail_head.comment LIKE '%sonic%'
      ) AND (
      detail_head.comment NOT LIKE '%report%'
      OR detail_head.comment NOT LIKE '%portal%'
      )",

你可以看到我使用的是 LIKE 而不是 LIKE。不幸的是,这并没有像我希望的那样工作。我猜这是因为我要的是 PORT,而不是 REPORT,所以无论如何它都会给我 LIKE。

我想知道在这种情况下我应该怎么做。我正在考虑制作另一个查询或数组,将其用作“排除列表”。如果查询是 LIKE 语句,我可以在 WHERE 子句中使用它来表示“table_uid NOT IN(LIST OF COMMA SEPARATED UIDs)”。

我有我想排除的 LIKE 语句:

$exclude_where_clauses = array(
        'CC'            => "(detail_head.comment LIKE '%ccb%') ",
        'CONNECT'       => "(detail_head.comment LIKE '%report%' OR detail_head.comment LIKE '%portal%') ",
        'EO'            => "(detail_head.comment LIKE '%OCU%' AND detail_head.comment LIKE '%KS%' AND detail_head.comment LIKE '%screen%' AND detail_head.comment LIKE '%term%') ",
        'INVENTORY'     => "(detail_head.comment LIKE '%discount%') ",
        'KS'            => "(detail_head.comment LIKE '%panel%' or detail_head.comment LIKE '%PMIX%' or detail_head.comment LIKE '%pmix%') ",
        'OCUS'          => "(detail_head.comment LIKE '%document%') ",
        'SALES'         => "(detail_head.comment LIKE '%point%') ",
        'SECURITY'      => "(detail_head.comment LIKE '%km%') ",
        'TERMS'         => "(detail_head.comment LIKE '%forward%' or detail_head.comment LIKE '%sales%' or detail_head.comment LIKE '%intermittent%' or detail_head.comment LIKE '%print%' or detail_head.comment LIKE '%de%min%' or detail_head.comment LIKE '%reciept%' or detail_head.comment LIKE '%time%') ",
);

所以,最后,我想将我当前的查询数组转换为"(detail_head.comment LIKE '%port%' or detail_head.comment LIKE '%forward%' or detail_head.comment LIKE '%connect%' or detail_head.comment LIKE '%router%' or detail_head.comment LIKE '%fire%wall%' or detail_head.comment LIKE '%sonic%') AND table_uid NOT IN(LIST OF COMMA SEPARATED UIDs) "

4

2 回答 2

1

尝试这个:

'CONNECT' => "
    (  detail_head.comment LIKE '%port%'
    OR detail_head.comment LIKE '%forward%'
    OR detail_head.comment LIKE '%connect%'
    OR detail_head.comment LIKE '%router%'
    OR detail_head.comment LIKE '%fire%wall%'
    OR detail_head.comment LIKE '%sonic%'
    )
    AND NOT (
           detail_head.comment LIKE '%ccb%'
        OR detail_head.comment LIKE '%report%' 
        OR detail_head.comment LIKE '%portal%'
        OR detail_head.comment LIKE '%OCU%'
        OR detail_head.comment LIKE '%KS%'
        OR detail_head.comment LIKE '%screen%'
        OR detail_head.comment LIKE '%term%'
        OR detail_head.comment LIKE '%discount%'
        OR detail_head.comment LIKE '%panel%'
        OR detail_head.comment LIKE '%PMIX%'
        OR detail_head.comment LIKE '%pmix%'
        OR detail_head.comment LIKE '%document%'
        OR detail_head.comment LIKE '%point%'
        OR detail_head.comment LIKE '%km%'
        OR detail_head.comment LIKE '%forward%'
        OR detail_head.comment LIKE '%sales%'
        OR detail_head.comment LIKE '%intermittent%'
        OR detail_head.comment LIKE '%print%'
        OR detail_head.comment LIKE '%de%min%'
        OR detail_head.comment LIKE '%reciept%'
        OR detail_head.comment LIKE '%time%'
    )
",
于 2013-05-13T17:54:23.097 回答
0

我不相信这会更有效(它可能确实效率较低),但是,它可能是一种更合理地定义你的规范的方法——在regexp().

这将返回 0:

SELECT 'foo report bar' REGEXP '[[:<:]]port[[:>:]]';

返回 1 的地方:

SELECT 'foo report bar' REGEXP '[[:<:]]report[[:>:]]';

MySQL 在手册中有更多信息。(5.1手动链接)

根据手头任务的性质,以及这会给我的数据库服务器带来的频率和压力,我可能会考虑添加字段或相关表来帮助我预先进行处理(当我插入数据时)所以我可以在事后以更轻松的方式运行这样的报告——而不必在全文字段中进行繁重的文本处理。

于 2013-05-13T15:24:15.510 回答