如何为所有列设置 AND 条件 - php
Posted
技术标签:
【中文标题】如何为所有列设置 AND 条件 - php【英文标题】:How set AND condition to ALL columns - php 【发布时间】:2015-06-26 01:10:43 【问题描述】:如果我输入,请在 MY TABLE 中
floor fly
表返回No matching records
,因为全局搜索 php 函数在单个列中搜索记录。
但我希望 AND 条件适用于所有列。
如果我输入floor fly
table,我应该显示如下内容:
|__Column1___|___Column2____|__Column4_|
| | | |
|..FLOOR... |DREAMS - FLY | 1994 |
| ..dreams | xyz | floor |
注意:这不是 OR 函数abc OR cde
这是我的 php 代码,但并不像我预期的那样工作:
static function filter ( $request, $columns, &$bindings )
$globalSearch = array();
$columnSearch = array();
$dtColumns = self::pluck( $columns, 'dt' );
if ( isset($request['search']) && $request['search']['value'] != '' )
$str = $request['search']['value'];
for ( $i=0, $ien=count($request['columns']) ; $i<$ien ; $i++ )
$requestColumn = $request['columns'][$i];
$columnIdx = array_search( $requestColumn['data'], $dtColumns );
$column = $columns[ $columnIdx ];
if ( $requestColumn['searchable'] == 'true' )
$binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
$globalSearch[] = "".$column['db']." LIKE ".$binding;
消除对我想要的任何疑问:LOOK
这是我想要的示例图片
【问题讨论】:
【参考方案1】:评论有点长。
对于这种类型的搜索,您可以考虑使用全文索引。文档是here。这些实现了MATCH . . . AGAINST
功能。
使用此类功能,您可以按相关性对结果进行排序。这意味着您不必提前决定多个单词之间的连接符是“and”还是“or”。如果您愿意,您还可以实现布尔搜索,这将允许更复杂的复杂逻辑。
【讨论】:
在THIS 示例中,我设置了全文索引,但如果我输入floor fly
,它就像一个纯OR 条件并返回太多记录,我只想像此表中那样过滤。 I wish this AND condtion 看看区别。但是在全文索引中设置 OR 条件我使用此代码但我不喜欢它 $globalSearch[] = "match(".$column['db'].") against (".$binding.")";
@user3520363 。 . .您是否知道fly
比默认的最小字长(4 个)短?所以它在搜索字符串中被完全忽略。另外,要获得相关性排序,需要使用order by
。
我不明白解决方案是不是全文索引,请问您可以查看HERE以消除任何疑问吗?目前,字长不是我首先关心的问题。我稍后会尝试解决这个问题【参考方案2】:
好吧,您应该决定要使用的搜索条件。 如果您希望通过某些短语使用匹配,并且不想使用全文搜索,您应该重建您的查询,如:
SELECT * FROM a WHERE a.col1 REGEXP 'text1|text2|text3' OR a.col2 REGEXP 'text1|text2|text3';
在你的 PHP 代码中,它应该是这样的(你没有指定输入数据格式,所以我假设你使用 "$str" 作为空格分隔的文本,并且想要检查 "$str" 中的所有单词搜索短语:
if ( $requestColumn['searchable'] == 'true' )
$str = str_replace(" ","|",$str);
$binding = self::bind( $bindings, $str, PDO::PARAM_STR );
$globalSearch[] = "".$column['db']." REGEXP ".$binding;
【讨论】:
我用你的代码替换,但你的 php 代码像 OR 函数一样工作。例如,如果我键入felino fly
表返回带有 felino
字的所有行和带有 fly
字的所有行。我想要连接函数,所以当我键入时,我只想显示带有两个单词的行。请问可以修吗?以上是关于如何为所有列设置 AND 条件 - php的主要内容,如果未能解决你的问题,请参考以下文章