php Mysql如何在多个WHERE';s

php Mysql如何在多个WHERE';s,php,mysql,where-clause,Php,Mysql,Where Clause,我有一个mysql请求,如下所示: $request = mysql_query (" SELECT title FROM mytable WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%') "); $z=1; while($result = mysql_fetch_array($request)) { $title[$z]=$result['t

我有一个mysql请求,如下所示:

$request = mysql_query (" 
    SELECT title 
    FROM mytable 
    WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%') 
");

$z=1;

while($result = mysql_fetch_array($request))
{
    $title[$z]=$result['title']);$z++;
};      
显然,我想显示一个实体的标题,其中该实体行的名称、描述或技能包含一个特定的单词

但是,我如何判断这个标题是否因为在“名称”、“描述”或“技能”上取得成功而显示

我的剧本根本没什么不同。 当然,我可以为每个元素创建一个请求,但我有很多请求

多谢各位

编辑:

也许是我,但这才是真正的要求,它还没有起作用:

<?php 

$requete3  = mysql_query("
    SELECT 
        denomination, 
        owners,
        description_".$get_lang.",
        CONCAT (
            IF (denomination LIKE '%".$search_word."%', '1', '0'),
            IF (owners LIKE '%".$search_word."%', '1', '0'),
            IF (description_".$get_lang." LIKE '%".$search_word."%', '1', '0')
        ) AS match_bitmask
    FROM element1_entities 
    WHERE 
    (
        denomination LIKE '%".$search_word."%' OR 
        owners LIKE '%".$search_word."%' OR 
        description_".$get_lang." LIKE '%".$search_word."%'
    )
    AND f_filter_types_entities_id=2
    ORDER BY id DESC 
");

?>

您可以尝试类似的方法-尽管您正在将一些处理推送到查询中

SELECT 
title, 
CONCAT(
    (IF (name LIKE '%word%', '1', '0')),
    (IF (description LIKE '%word%', '1', '0')),
    (IF (skills LIKE '%word%', '1', '0'))
) AS match_bitmask

FROM mytable 
WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%')
这将为您提供一种二进制位掩码,提供有关在何处找到匹配项的信息

因此,
name
skills
上的匹配将在一个名为
match\u bitmask
的列中为您提供
101
,您可以在PHP循环中访问该列

进入循环后,您的位掩码中基本上有3列,name在第4列(位掩码的第一列),description在第2列(第2列)和skills在第1列(第三列)

然后,您可以评估结果与以下匹配的位置:

$iBitmask = (int) $result['match_bitmask'];
$iDecimalmask = bindec($iBitmask);

// if `name` matches
if($iDecimalmask & 4) {
  ... do stuff ...
}

// if `description` matches
if($iDecimalmask & 2) {
  ... do stuff ...
}

// if `skills` matches
if($iDecimalmask & 1) {
  ... do stuff ...
}

您可以尝试类似的方法-尽管您正在将一些处理推送到查询中

SELECT 
title, 
CONCAT(
    (IF (name LIKE '%word%', '1', '0')),
    (IF (description LIKE '%word%', '1', '0')),
    (IF (skills LIKE '%word%', '1', '0'))
) AS match_bitmask

FROM mytable 
WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%')
这将为您提供一种二进制位掩码,提供有关在何处找到匹配项的信息

因此,
name
skills
上的匹配将在一个名为
match\u bitmask
的列中为您提供
101
,您可以在PHP循环中访问该列

进入循环后,您的位掩码中基本上有3列,name在第4列(位掩码的第一列),description在第2列(第2列)和skills在第1列(第三列)

然后,您可以评估结果与以下匹配的位置:

$iBitmask = (int) $result['match_bitmask'];
$iDecimalmask = bindec($iBitmask);

// if `name` matches
if($iDecimalmask & 4) {
  ... do stuff ...
}

// if `description` matches
if($iDecimalmask & 2) {
  ... do stuff ...
}

// if `skills` matches
if($iDecimalmask & 1) {
  ... do stuff ...
}
我想我更喜欢CD001的答案,但这是另一种选择


我想我更喜欢CD001的答案,但这是另一种选择。

这是关于SQL的问题,而不是php本身的问题。我建议的第一个解决方案是使用“CASE”语法

您可以通过以下方式编辑查询:

SELECT title,
       CASE
            WHEN name LIKE '%word%' THEN 'name'
            WHEN description LIKE '%word%' THEN 'description'
            WHEN skills LIKE '%word%' THEN 'skills'
       END AS field,
       ...
FROM mytable 
WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%') 

因此,您将获得word的标题和找到位置的参考。

这是一个关于SQL的问题,而不是php本身的问题。我建议的第一个解决方案是使用“CASE”语法

您可以通过以下方式编辑查询:

SELECT title,
       CASE
            WHEN name LIKE '%word%' THEN 'name'
            WHEN description LIKE '%word%' THEN 'description'
            WHEN skills LIKE '%word%' THEN 'skills'
       END AS field,
       ...
FROM mytable 
WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%') 

因此,您将获得word的标题和找到位置的参考。

如果您想避免php过滤,可以使用我的解决方案的一个变体,并使用CASE:

SELECT
   CASE
        WHEN name LIKE '%word%' THEN CONCAT('name: ', title)
        WHEN description LIKE '%word%' THEN CONCAT('description: ', title)
        WHEN skills LIKE '%word%' THEN CONCAT('skills: ', title)
   END AS title,
   FROM mytable 
   WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%') 

如果您想避免php过滤,可以将my solution的一个变体与CASE一起使用:

SELECT
   CASE
        WHEN name LIKE '%word%' THEN CONCAT('name: ', title)
        WHEN description LIKE '%word%' THEN CONCAT('description: ', title)
        WHEN skills LIKE '%word%' THEN CONCAT('skills: ', title)
   END AS title,
   FROM mytable 
   WHERE (name LIKE '%word%' OR description LIKE '%word%' OR skills LIKE '%word%') 

这里有一个解决方案。。。用小提琴

与其他一些类似,但此项将返回一个以空格分隔的匹配项列表,作为
匹配项

它看起来有点复杂,但只是因为我在几个地方使用了
CONCAT(“%”,@word“%”)
,所以我可以只使用一次@word var

set @word = 'fox';

SELECT title, 
CONCAT( 
 IF(title LIKE CONCAT('%', @word, '%'),'title ',''),
 IF(description LIKE CONCAT('%', @word, '%'),'desc ',''),
 IF(skills LIKE CONCAT('%', @word, '%'),'skills','')
  )
AS matches
FROM mytable 
WHERE  title LIKE CONCAT('%', @word, '%')
       OR description LIKE CONCAT('%', @word, '%')
       OR skills LIKE CONCAT('%', @word, '%') 
给出如下结果:

TITLE   MATCHES
------  ------
test    desc
fox     title skills

这里有一个解决方案。。。用小提琴

与其他一些类似,但此项将返回一个以空格分隔的匹配项列表,作为
匹配项

它看起来有点复杂,但只是因为我在几个地方使用了
CONCAT(“%”,@word“%”)
,所以我可以只使用一次@word var

set @word = 'fox';

SELECT title, 
CONCAT( 
 IF(title LIKE CONCAT('%', @word, '%'),'title ',''),
 IF(description LIKE CONCAT('%', @word, '%'),'desc ',''),
 IF(skills LIKE CONCAT('%', @word, '%'),'skills','')
  )
AS matches
FROM mytable 
WHERE  title LIKE CONCAT('%', @word, '%')
       OR description LIKE CONCAT('%', @word, '%')
       OR skills LIKE CONCAT('%', @word, '%') 
给出如下结果:

TITLE   MATCHES
------  ------
test    desc
fox     title skills


同时选择名称描述和技能,并在php中检查它们是否匹配%word%确定谢谢。但是没有mysql命令可以在不涉及通过PHP过滤的额外步骤的情况下进行区分吗?如果
name
description
都匹配
%word%
我可以使用该信息,但如果它只标记第一次遇到的成功,我可以接受。同时选择名称描述和技能,如果它们与%word%匹配,请登录php。好的,谢谢。但是没有mysql命令可以在不涉及通过PHP过滤的额外步骤的情况下进行区分吗?如果
name
description
都匹配
%word%
,我可以使用这些信息,但是如果它只标志着第一次遇到的成功,我可以接受它。很好!我会尝试一下,然后回来检查它是否有效。非常感谢。由于最初有一些括号放错了位置,所以必须进行轻微的编辑:\n我根据您的原始和编辑的脚本进行了更改,但仍然得到“mysql\u fetch\u array():提供的参数不是有效的mysql结果资源”。如果我去掉了concat部分,错误消息就会消失…奇怪的是,让它在我的本地服务器上工作(好吧,一个编辑过的版本来匹配我的一个表)。。。也许您的MySQL版本希望首先评估
IF
s。。。我会再加上一些括号,看看是否排序。@Baylock我看不到语法有任何明显的变化(只要插入的PHP变量都存在且正确)。。。我会以不同的方式编写它,并使用带有绑定参数的PDO,因为
mysql
库现在基本上已经不存在了。。。但是我看不出语法有什么问题会导致它现在掉下来。太好了!我会尝试一下,然后回来检查它是否有效。非常感谢。由于最初有一些括号放错了位置,所以必须进行轻微的编辑:\n我根据您的原始和编辑的脚本进行了更改,但仍然得到“mysql\u fetch\u array():提供的参数不是有效的mysql结果资源”。如果我去掉了concat部分,错误消息就会消失…奇怪的是,让它在我的本地服务器上工作(好吧,一个编辑过的版本来匹配我的一个表)。。。也许您的MySQL版本希望首先评估
IF
s。。。我再加一些括号,看看这是否正确