php Mysql如何在多个WHERE';s
我有一个mysql请求,如下所示: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
$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。。。我再加一些括号,看看这是否正确