Php 显示通过搜索查询找到的列
我有一段简单的代码,它从我的一个数据库表中的所有行中搜索三列。表名是“articles”,我搜索的3列是“Title、Description和Tags”。当我搜索一个单词或短语时,它会向我显示结果,我想知道的是,是否有一种方法可以让我显示在3列中找到的结果。我是否必须对结果返回的每一行运行单独的查询,还是有更简单的方法?我在下面包含了一段代码Php 显示通过搜索查询找到的列,php,mysql,search,Php,Mysql,Search,我有一段简单的代码,它从我的一个数据库表中的所有行中搜索三列。表名是“articles”,我搜索的3列是“Title、Description和Tags”。当我搜索一个单词或短语时,它会向我显示结果,我想知道的是,是否有一种方法可以让我显示在3列中找到的结果。我是否必须对结果返回的每一行运行单独的查询,还是有更简单的方法?我在下面包含了一段代码 $query = $_GET['q']; $sql = "SELECT * FROM articles WHERE (`title` LIKE '%".$
$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
}
快速修复方法是使用您的条件选择一些附加列:
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注入问题。另一种方法是在选择列表中测试表达式中的条件 我认为最简单的解释方法是举例说明。但出于良心,我不能发布易受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 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
对于返回的每一行,将计算选择列表中的表达式。条件测试(LIKE
comparison)评估为真、假或空。MySQLIF
函数将第一个参数计算为布尔值,如果为真,则返回第二个参数,elise返回第三个参数
在本例中,如果存在匹配项,表达式将返回1
。否则,它将返回一个0
。对于我们可以返回的值,还有很多其他选择。我们还可以将这些条件组合到一个表达式中,以返回一个值
有很多可能的表达式可以包含条件测试。我刚刚使用了MySQLIF
函数。更符合ANSI标准的表达式可以使用大小写
,例如
SELECT CASE WHEN a.`title` LIKE CONCAT('%', ? ,'%')
THEN 1
ELSE 0
END AS match_in_title
这样的办法应该行得通。 使用名为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
一个名为tags的列的出现通常是设计不佳的症状。你可以使用UNION来解决你的问题。是的,我知道列名并不完美。我重新命名了它们,使事情变得简单,这样问我的问题就更容易了。我还需要进一步研究一下你的代码,因为我不确定它在做什么。哈哈,当谈到php和mysql的时候,我还是个新手,试着一天一天教自己所有这些东西,但这是我一定会研究的建议@Born2DoubleUp您将在找到的每一行中增加3列,这些列的值为
yep
或nope
(1和0当然很方便…)。只需在例如phpMyAdmin中运行它即可查看结果。@Born2DoubleUp我已切换到整数输出,以便于检查。请注意,此查询可能会多次从文章中返回同一行。例如,如果标记
和标题
上的行“匹配”@spencer7593 true,则主题启动程序应在所有联合后删除关键字ALL以删除重复项使用联合
代替联合所有
实际上并不能解决这一问题,因为搜索列
返回的值在查询之间是不同的,'title'
与'tags'
。唯一排序操作将保留两行。