Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-使用ORs时,如何知道哪个字段与结果匹配_Php_Mysql_Search_Keyword - Fatal编程技术网

Php MySQL-使用ORs时,如何知道哪个字段与结果匹配

Php MySQL-使用ORs时,如何知道哪个字段与结果匹配,php,mysql,search,keyword,Php,Mysql,Search,Keyword,我正在创建一个引擎,使用MySQL在多个字段中查找结果,例如: SELECT table1.*, table2.* FROM table1 JOIN table2 ON table1.id = table2.tid WHERE (table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%') AND (table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%') O

我正在创建一个引擎,使用MySQL在多个字段中查找结果,例如:

SELECT table1.*, table2.* FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%')
AND
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%')
ORDER BY table1.id ASC;
但现在我需要知道哪个字段与关键字匹配。。。我该怎么做

顺便说一句,我正在使用PHP。

你可以这样做

SELECT table1.*, table2.*, 'table1' as `target` as FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%')
UNION ALL 
SELECT table1.*, table2.*,'table2' as target FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%')
然后在检索结果时检查
target
是否为表1或表2

SELECT table1.*, table2.*, 'table1' as `target` as FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%')
UNION ALL 
SELECT table1.*, table2.*,'table2' as target FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%')

然后检查
target
是否为表1或表2。在循环中检索结果时,可以执行以下操作:

Table X
Field1      Field2
-------------------
boat        caca
hello       boat

$Keyword = 'boat';
while($Res = blabla){
    if(strpos($Res['Field1'], $Keyword) !== false){
        echo 'String found in Field 1<br />';
    }

    if(strpos($Res['Field2'], $Keyword) !== false){
        echo 'String found in Field 2<br />';
    }
}

// Will output
String found in Field 1<br />
String found in Field 2<br />
表X
字段1字段2
-------------------
卡卡船
你好,船
$Keyword='boat';
而($Res=blabla){
if(strpos($Res['Field1',$关键字)!==false){
回显“在字段1中找到字符串”
; } if(strpos($Res['Field2',$Keyword)!==false){ 回显“在字段2中找到字符串”
; } } //将输出 在字段1中找到字符串
在字段2中找到字符串

在循环中,您可以执行以下操作:

Table X
Field1      Field2
-------------------
boat        caca
hello       boat

$Keyword = 'boat';
while($Res = blabla){
    if(strpos($Res['Field1'], $Keyword) !== false){
        echo 'String found in Field 1<br />';
    }

    if(strpos($Res['Field2'], $Keyword) !== false){
        echo 'String found in Field 2<br />';
    }
}

// Will output
String found in Field 1<br />
String found in Field 2<br />
表X
字段1字段2
-------------------
卡卡船
你好,船
$Keyword='boat';
而($Res=blabla){
if(strpos($Res['Field1',$关键字)!==false){
回显“在字段1中找到字符串”
; } if(strpos($Res['Field2',$Keyword)!==false){ 回显“在字段2中找到字符串”
; } } //将输出 在字段1中找到字符串
在字段2中找到字符串

您可以为您的条件添加列

SELECT table1.*, table2.*, 
table1.field1 LIKE 'keyword%' AS Table1Field1Match, 
table1.field2 LIKE 'keyword%' AS Table1Field2Match,
table2.field1 LIKE 'keyword%' AS Table2Field1Match, 
table2.field2 LIKE 'keyword%' AS Table2Field2Match
FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%')
AND
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%')
ORDER BY table1.id ASC;

您可以为您的条件添加列

SELECT table1.*, table2.*, 
table1.field1 LIKE 'keyword%' AS Table1Field1Match, 
table1.field2 LIKE 'keyword%' AS Table1Field2Match,
table2.field1 LIKE 'keyword%' AS Table2Field1Match, 
table2.field2 LIKE 'keyword%' AS Table2Field2Match
FROM table1
JOIN table2
ON table1.id = table2.tid
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%')
AND
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%')
ORDER BY table1.id ASC;
未经核实:

SELECT table1.*, 
       table2.*, 
       case (table2.field1 LIKE 'keyword%' and table1.field1 LIKE 'keyword%')
           when 1 
           then 'f1' 
           else 'f2' 
       end as field
FROM table1
...
未经核实:

SELECT table1.*, 
       table2.*, 
       case (table2.field1 LIKE 'keyword%' and table1.field1 LIKE 'keyword%')
           when 1 
           then 'f1' 
           else 'f2' 
       end as field
FROM table1
...

-1这不就是让处理器做更多的工作吗?您已经在MySQL中完成了字符串匹配,为什么还要在PHP中再次进行匹配呢?因为首先比较容易。第二,它需要更多的处理器,但是,如果MySQL有更少的工作要做,你的MySQL服务器会更快,你不知道吗-1这不就是让处理器做更多的工作吗?您已经在MySQL中完成了字符串匹配,为什么还要在PHP中再次进行匹配呢?因为首先比较容易。第二,它需要更多的处理器,但是,如果MySQL有更少的工作要做,你的MySQL服务器会更快,你不知道吗。。。不确定这是否会有所不同,但在SELECT和WHERE中都使用类似的选项可能会使MySQL进行两次匹配。字符串匹配可能会很昂贵(尤其是使用ORs),因此在“选择并使用”中进行匹配可能会更好,因为必须过滤结果?拥有通常永远不会更好。在某些情况下,它仍然需要在过滤之前生成完整的结果集,这会使一切变得缓慢。在这种情况下,由于SELECT部分中的条件将只针对匹配的行进行计算,因此我认为这不会产生太大的影响。不确定这是否会产生影响,但SELECT和WHERE中的条件相同可能会使MySQL进行两次匹配。字符串匹配可能会很昂贵(尤其是使用ORs),因此在“选择并使用”中进行匹配可能会更好,因为必须过滤结果?拥有通常永远不会更好。在某些情况下,它仍然需要在过滤之前生成完整的结果集,这会使一切变得缓慢。在这种情况下,由于SELECT部分中的条件将只针对匹配的行进行计算,因此我认为这不会产生太大的影响。