我有一段简单的代码,可以从我的一个数据库表中的所有行中搜索三列。表名是"文章"我正在搜索的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
}
答案 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