我有以下MYSQL查询:
<?php
require "gospel_connect.php";
if(isset($_GET["keywords"])) {
$keywords = $db->escape_string($_GET["keywords"]);
$query = $db->query("SELECT *,
CASE
WHEN scriptures LIKE '%{$keywords}%' THEN scriptures_link
WHEN books LIKE '%{$keywords}%' THEN books_link
END as the_link
FROM data WHERE scriptures LIKE '%{$keywords}%' OR books LIKE '%{$keywords}%'");
?>
<div class='result-count'>
Found <?php echo $query->num_rows; ?> results.
</div>
<?php
if($query->num_rows) {
while($r = $query->fetch_object()) {
?>
<div class='result'>
<?php
$link = $r->the_link;
echo "<a href='$link'> Hi </a> <br>";
?>
</div>
<?php
}
}
}
让我解释一下,查询是从db表data
中搜索的,它有以下列:id
, date
, scriptures
, books
, scriptures_link
, books_link
。
现在,查询正在完美地工作。它返回相应的链接。问题是,如果 scriptures
和books
都与关键字匹配,则只显示一个结果。如果两个都有匹配,我希望两个都出现。否则,我只需要一个集合来返回信息。我怎么能做到这一点?
问题是您希望从数据库表中的一行返回两行。在您的情况下,您应该使用UNION ALL
来获得所需的结果:
SELECT *, scriptures_link AS the_link
FROM data WHERE scriptures LIKE '%{$keywords}%'
UNION ALL
SELECT *, books_link AS the_link
FROM data WHERE books LIKE '%{$keywords}%'
如果将表分成两个,一个用于存放经文,另一个用于存放书籍,则此查询(在更改表名之后)也可以工作。这可能是一个更好的数据库设计。另一种可能性是为每个可能的匹配使用一行,然后添加一列(),例如: