【问题标题】:PHP mysql search multiple tables using a keywordPHP mysql使用关键字搜索多个表
【发布时间】:2011-09-28 07:24:44
【问题描述】:

我的数据库中有三个表:

messages
topics
comments

每个表格都有两个字段,分别称为“内容”和“标题”。我希望能够在我的 sql 语句中使用“Like”来查看“messages.content”、“messages.title”、“topics.content”、“topics.title”、“cmets.content”和“cmets”。标题'使用关键字。

到目前为止,我的查询只能从一个表中找到结果:

mysql_query("SELECT * FROM messages 
WHERE content LIKE '%" . $keyword . "%' 
OR title LIKE '%" . $keyword ."%'");

我也想知道,一旦我从多个表中获取结果,我怎么知道哪个表的结果是什么?

任何帮助将不胜感激!

【问题讨论】:

标签: php mysql full-text-search


【解决方案1】:

您可能正在寻找的是 UNION 命令:

SELECT id, 'messages' as 'table' FROM messages 
  WHERE content LIKE '%keyword%' 
    OR title LIKE '%keyword%'
UNION
SELECT id, 'topics' as 'table' FROM topics
  WHERE content LIKE '%keyword%' 
    OR title LIKE '%keyword%'
UNION
SELECT id, 'comments' as 'table' FROM comments
  WHERE content LIKE '%keyword%' 
    OR title LIKE '%keyword%'

【讨论】:

    【解决方案2】:

    HTML 搜索表单:

    <div class="header_top_right">
        <form action="search.php" method="GET" class="search_form">
            <input type="text" placeholder="Text to Search.." name="search">
            <input type="submit" class="btn btn-default" value="">
        </form>
    </div>
    

    搜索.php:

    <?php
        if (isset($_GET['search']) || !empty($_GET['search'])) {
            $search = mysqli_real_escape_string($db->link, $fm->validation($_GET['search']));
        }
        else{
            header("Location:404.php");
        }
    ?>
    <?php
        $query = "SELECT * FROM news_post WHERE title LIKE '%$search%' OR body LIKE '%$search%' OR tags LIKE '%search%'";
        $post = $db->select($query);
        if ($post) {
            while ($result = $post->fetch_assoc()) {
                echo"Database data like, $result['title']";
            }
        }
        else{
            echo "result Not found";
        }
    

    在 search.php 中包含 database.php

    class Database{
        public function select($query){
            $result = $this->link->query($query) or die($this->link->error.__LINE__);
            if($result->num_rows > 0){
                return $result;
            }
            else {
                return false;
            }
        }
    }
    $db = new Database();
    

    【讨论】:

      【解决方案3】:
      $query = "(SELECT content, title, 'msg' as type FROM messages WHERE content LIKE '%" . 
                 $keyword . "%' OR title LIKE '%" . $keyword ."%') 
                 UNION
                 (SELECT content, title, 'topic' as type FROM topics WHERE content LIKE '%" . 
                 $keyword . "%' OR title LIKE '%" . $keyword ."%') 
                 UNION
                 (SELECT content, title, 'comment' as type FROM comments WHERE content LIKE '%" . 
                 $keyword . "%' OR title LIKE '%" . $keyword ."%')";
      
      mysql_query($query);
      

      因此,您从所有三个表中获取结果,并且您可以通过查看其 type 值来确定哪一行来自哪个表。

      【讨论】:

      • 绝对是正确的答案。谢谢!类型方法正是我所需要的。
      • 使用此查询完美,唯一的问题是为什么我不能添加另一个字段,如“SELECT 内容、标题、用户名”?当我这样做时,我得到一个服务器错误 500。你知道吗?提前致谢!
      • @FrankW.:嗨,弗兰克,很抱歉我之前没有注意到您的评论。希望您解决了您的问题?
      • 亲爱的先生,如果一个表与另一个表有不同的列名,如何实现?
      【解决方案4】:

      在您使用的其他表中进行两次搜索:

      SELECT `categories`.`title`, `posts`.`title` WHERE `categories`.`title` LIKE {$a} OR `posts`.`title` LIKE {$a}
      

      CATEGORIESPOSTS 是数据库的表。

      【讨论】:

      • 不是我想要的。不过还是谢谢你的回答!
      • 它会返回重复值!
      猜你喜欢
      • 2013-04-25
      • 2010-11-08
      • 2013-04-08
      • 1970-01-01
      • 2018-12-16
      • 2011-03-17
      • 2012-09-09
      • 2019-02-07
      相关资源
      最近更新 更多