PHP mysql使用关键字搜索多个表

Posted

技术标签:

【中文标题】PHP mysql使用关键字搜索多个表【英文标题】:PHP mysql search multiple tables using a keyword 【发布时间】: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 ."%'");

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

任何帮助将不胜感激!

【问题讨论】:

你不只是做 3 个不同的查询有什么原因吗?这些列可能并不相同。 全文搜索 (FTS) 是推荐的方法 - MySQL has native syntax, but it's for MyISAM only。否则,您必须寻求第三方支持,例如 Sphinx。 【参考方案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 是数据库的表。

【讨论】:

不是我想要的。不过还是谢谢你的回答! 它会返回重复值!

以上是关于PHP mysql使用关键字搜索多个表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 和 Mysql 将搜索框放入数据库表中

如何优化具有多个结果的 MySQL/MyISAM 全文搜索

在mysql中使用带有单个关键字的单个where条件搜索表的所有列

PHP实现多个关键词搜索查询功能,以前实现过。

如何使用 Sail.js 和 MySQL 实现全文搜索?

根据关键字出现对搜索结果进行排名