php - MySql SELECT 查询跨多个字段的多个关键字

标签 php mysql select match against

我需要一些关于 SELECT 查询逻辑的帮助,希望有人能给我一个比我现有的更好的主意。

我有一个这样的表:

 +---------+----------+---------+-----------+
 |      id | model    | variant | category  |
 +---------+----------+---------+-----------+
 |       1 | round    | black   | fruit     |
 |       2 | square   | white   | vegetable |
 |       3 | flat     | red     | meat      |
 |       4 | round    | black   | meat      |
 +---------+----------+---------+-----------+

用户将被允许通过输入一个或多个关键字对该表进行搜索。

我现在的查询对所有输入的关键字 AGAINST 每个字段执行 MATCH,我得到与任何关键字匹配的行。 因此,如果输入是“round meat”,结果将是第 1、3 和 4 行:

SELECT v.*, vt.color 
            FROM tbl_items 
            AS v 
            LEFT JOIN tbl_apple 
            AS vt 
            ON v.id = vt.v_id 
            WHERE ( 
            MATCH (v.model) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE) 
            OR MATCH (v.variant) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE) 
            OR MATCH (v.category) AGAINST ('keyword1 keyword2 ' IN BOOLEAN MODE) ) 
            AND v.type = 4

但是,我只需要返回包含所有关键字的行。关键字可能包含在三列中的任何一列中。

因此,如果用户输入“round meat”,则只返回第 4 行。

我目前的想法很简单,可能不是很好(我预计多个关键字会出现一些性能问题):

SELECT v.*, vt.color 
            FROM tbl_items 
            AS v 
            LEFT JOIN tbl_apple 
            AS vt 
            ON v.id = vt.v_id 
            WHERE 
                ( 
                     (v.model = 'keyword1' 
                   OR v.variant = 'keyword1' 
                   OR v.category = 'keyword1'
                     ) 
        AND 
                     (v.model = 'keyword2' 
                   OR v.variant = 'keyword2' 
                   OR v.category = 'keyword2'
                     )
                 ) 
            AND v.type = 4

有更好的方法吗?

最佳答案

这是一个完整的代码,可能会对您有所帮助。" 您可以根据数据库或要求修改查询。

    <?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'test');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);

if(isset($_POST['submit']))
{
    $search_text = $_POST['text'];

    $values = explode(" ",$search_text);

    $query = "";
    foreach($values as $value)
    {
        $query .='concat(model,varient,category) like "%'.$value.'%" AND ';
    }

    $query .= "1=1";

    $query = "select * from tbl_items where ".$query."";
    $result= mysqli_query($db,$query);
    echo '<table>';
    while($row=mysqli_fetch_array($result))
    {
        echo '<tr>';
        echo '<td>'.$row['model'].'</td><td>'.$row['varient'].'</td><td>'.$row['category'].'</td>';
        echo '</tr>';
    }
echo '</table>';
}
?>
<form method="post" name="form">
<input type="text" name="text" />
<input type="submit" value="submit" name="submit">  
</form>

关于php - MySql SELECT 查询跨多个字段的多个关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786892/

相关文章:

php - Laravel Eloquent 发现返回 null

java - 如何在具有动态列的表中插入值 Jdbc/Mysql

php - Laravel Session 检测到一个域、多个数据库

css - 在IE浏览器中的select标记选项之间添加空格

php - Mysql select into PHP associative array 不工作

php - 第 551 行的 fatal error : Maximum execution time of 30 seconds exceeded in c:\wamp\www\drupal2\includes\common. inc

php - 正则表达式从 css 文件中删除行

php - 即使用户没有从所有选择框中进行选择,如何显示结果?

mysql - Sum() AS var 在同一查询中使用时表示 var 不存在,不明白为什么

php - 通过 AJAX 提交表单不起作用