我有以下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
都与关键字匹配,则只会显示一个结果。如果两者都有匹配,我希望两者都出现。否则,我只想要一组返回信息。 我该如何做到这一点?
答案 0 :(得分:1)
问题是您希望从数据库表中的一行返回两行。在您的情况下,您应该使用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}%'
如果您将表格拆分为两个,一个用于经文,一个用于书籍,此查询也可用(在更改表名后)。这可能是一个更好的数据库设计。另一种可能性是为每个可能的匹配使用一行,然后添加一列(例如源)以标识数据源。