显示使用搜索查询找到的列

时间:2017-03-07 14:53:11

标签: php mysql search

我有一段简单的代码,可以从我的一个数据库表中的所有行中搜索三列。表名是"文章"我正在搜索的3列是"标题,描述和标签"。目前我搜索一个单词或短语并向我显示结果,我想知道的是,是否有办法让我显示结果中找到了哪三列。我是否必须为结果返回的每一行运行单独的查询,还是有更简单的方法?我在下面提供了我的代码片段。

$query = $_GET['q'];
$sql = "SELECT * FROM articles WHERE (`title` LIKE '%".$query."%') OR (`description` LIKE '%".$query."%') OR (`tags` LIKE '%".$query."%') ORDER BY dateadded";
$query = $db->query($sql);
while($row = $query->fetch_assoc()) {
display 
} 

3 个答案:

答案 0 :(得分:1)

快速解决方法是使用您的条件选择一些其他列:

SELECT *,
  IF(`title` LIKE '%".$query."%',       1, 0)  AS conditionTitle,
  IF(`description` LIKE '%".$query."%', 1, 0)  AS conditionDescription,
  IF(`tags` LIKE '%".$query."%',        1, 0)  AS conditionTags
FROM articles 
WHERE (`title` LIKE '%".$query."%')
  OR (`description` LIKE '%".$query."%')
  OR (`tags` LIKE '%".$query."%') 
ORDER BY dateadded";

现在,您可以检查每行中这些附加列的值,以检查是否在该特定字段中找到了$query

请注意,您现在应该使用预准备语句,因为您可能有SQL注入问题。

答案 1 :(得分:0)

另一种方法是在SELECT列表中测试表达式中的条件。

我认为最简单的解释方法就是举例。但我不能凭良心发布易受SQL注入攻击的示例代码。

当前查询:

 SELECT a.*
   FROM articles
  WHERE a.`title`       LIKE CONCAT('%', ? ,'%')
     OR a.`description` LIKE CONCAT('%', ? ,'%')
     OR a.`tags`        LIKE CONCAT('%', ? ,'%')
  ORDER
     BY a.dateadded

对于当前查询,我们可以将表达式添加到SELECT列表中。举个例子:

 SELECT IF( a.`title`       LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_title 
      , IF( a.`description` LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_description
      , IF( a.`tags`        LIKE CONCAT('%', ? ,'%') ,1,0) AS match_in_tags
      , a.*
   FROM articles
  WHERE a.`title`       LIKE CONCAT('%', ? ,'%')
     OR a.`description` LIKE CONCAT('%', ? ,'%')
     OR a.`tags`        LIKE CONCAT('%', ? ,'%')
  ORDER
     BY a.dateadded

对于返回的每一行,将评估SELECT列表中的表达式。条件测试(LIKE比较)被评估为TRUE,FALSE或NULL。 MySQL IF函数将第一个参数计算为布尔值,如果是,则返回第二个参数,elise返回第三个参数。

在此示例中,如果匹配,表达式将返回1。否则,它返回0。对于我们可以返回的值,还有很多其他选择。我们还可以在单​​个表达式中组合条件,以返回单个值。

并且有很多可能的表达式可以包括条件测试。我刚刚使用了MySQL IF函数。符合ANSI标准的表达式可以使用CASE,例如

 SELECT CASE WHEN a.`title`       LIKE CONCAT('%', ? ,'%') 
             THEN 1
             ELSE 0
        END AS match_in_title

答案 2 :(得分:0)

这样的事情应该有效。 使用名为search_articles和UNION ALL的已传递表将SELECT查询组合在一起。

SELECT
  search_column
, *
FROM (
  SELECT
   'title' AS search_column
   , *
  FROM
   artices
  WHERE
   title LIKE '%query%'

  UNION ALL 

  SELECT
   'description' AS search_column
   , *
  FROM
   artices
  WHERE
   description LIKE '%query%' 

  UNION ALL 

  SELECT
   'tags' AS search_column
   , *
  FROM
   artices
  WHERE
   tags LIKE '%query%'  
)
 AS
   search_articles