我需要帮助使用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而不是喜欢。遗憾的是,这并不像我希望的那样。我猜这是因为我要求PORT,而不是REPORT,所以无论如何它给了我LIKE。
我想知道在这样的情况下我应该做些什么。我正在考虑制作另一个我将用作“排除列表”的查询或数组。如果查询是LIKE语句,我可以在我的WHERE子句中使用'table_uid NOT IN(COMMA SEPARATED UID列表)'。
我有我想要排除的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) "
答案 0 :(得分: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%'
)
",
答案 1 :(得分:0)
我不相信这会更高效(可能确实效率不高),但是,它可能是一种更合理地定义规范的方法 - 使用regexp()
中的字边界
返回0:
SELECT 'foo report bar' REGEXP '[[:<:]]port[[:>:]]';
这会返回1:
SELECT 'foo report bar' REGEXP '[[:<:]]report[[:>:]]';
MySQL has more info in the manual。 (5.1手动链接)
根据手头任务的性质,以及这将给我的数据库服务器带来多大程度的压力,我可能会考虑添加字段或相关表来帮助我预先进行处理(当我插入时数据)所以我可以以更轻松的方式运行这样的报告 - 而不必在全文字段中进行大量的文本处理。