如何从一个表行获得两个结果行


How to get two result rows from one table row

我有以下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

现在,查询正在完美地工作。它返回相应的链接。问题是,如果 scripturesbooks都与关键字匹配,则只显示一个结果。如果两个都有匹配,我希望两个都出现。否则,我只需要一个集合来返回信息。我怎么能做到这一点?

问题是您希望从数据库表中的一行返回两行。在您的情况下,您应该使用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}%'

如果将表分成两个,一个用于存放经文,另一个用于存放书籍,则此查询(在更改表名之后)也可以工作。这可能是一个更好的数据库设计。另一种可能性是为每个可能的匹配使用一行,然后添加一列(),例如: