PHP-使用多个MySQL表进行实时搜索

PHP-使用多个MySQL表进行实时搜索,php,jquery,mysql,ajax,Php,Jquery,Mysql,Ajax,我在互联网上搜索过,但找不到类似我的问题。我正在尝试构建一个实时搜索功能,可以从多个表中提取数据。它只在一张桌子上工作,但我希望能够从乐队、用户(专辑等)中获取信息 以下是我的PHP代码: require ("includes/config/config.php"); $search_term = sanitize(htmlentities($_POST['search_term'])); if (!empty($search_term)){ $search = "(SELECT

我在互联网上搜索过,但找不到类似我的问题。我正在尝试构建一个实时搜索功能,可以从多个表中提取数据。它只在一张桌子上工作,但我希望能够从乐队、用户(专辑等)中获取信息

以下是我的PHP代码:

require ("includes/config/config.php"); 

$search_term = sanitize(htmlentities($_POST['search_term']));

if (!empty($search_term)){

    $search = "(SELECT `band_id`, `band_name` FROM `bands` WHERE `band_name` LIKE '%$search_term%'  LIMIT 0, 5) 
                UNION ALL
                (SELECT `user_id`, `username` FROM `users` WHERE `username` LIKE '%$search_term%'  LIMIT 0, 5)";
    $query = mysqli_query($conn, $search);
    $result = mysqli_num_rows($query);

    while ($row = mysqli_fetch_assoc($query)){
        #$user_id = $row['user_id'];
        #$username = $row['username'];
        $band_id = $row['band_id'];
        $band_name = $row['band_name'];
        $check = mysqli_num_rows($query);



        if ($check != 0){
            echo "<a style='text-decoration: none; color: black;' href='index.php?band=$band_id'><li class='searchResults'>" . ucfirst($band_name) . "</li></a>";
        } else {
            echo "<li class='searchResults'>No Results Found</li>";
        }
    }
}

同样,其他一切运行正常,但我不知道如何查询多个表,以便以不同的方式回显href(即index.php?band=$band\u id for band和index.php?user=$user\u id for user.

问题是,通过执行
联合所有
,您正在丢失记录是一个乐队还是一个用户的信息。这将不同类型的记录放入同一集中,并合并列
band\u id
user\u id
band\u name
用户名

您可以通过不同的方式解决此问题:

  • 创建两个单独的查询。然后从bands查询中获取所有结果并将其放入一个数组中,然后将用户查询的所有结果放入另一个数组中。然后,回显两个数组的结果

  • 让MySQL告诉您每行的类型。您可以通过如下方式更改查询来实现这一点:

    (
        SELECT `band_id` , `band_name` , "band" AS `type`
        FROM `bands`
        WHERE `band_name` LIKE '%$search_term%'
        LIMIT 0 , 5
    )
    UNION ALL (    
        SELECT `user_id` , `username` , "user" AS `type`
        FROM `users`
        WHERE `username` LIKE '%$search_term%'
        LIMIT 0 , 5
    )
    
    if($row["type"] === "band") {
        echo "somelink?band_id=" . $row["band_id"];
    } else {
        echo "somelink?user_id=" . $row["band_id"];
    }
    
    您的查询结果现在将有一个名为
    type
    的附加列,该列将包含
    “band”
    “user”
    。根据该列的值,您可以回显不同的链接

    例如,您可以这样扩展代码:

    (
        SELECT `band_id` , `band_name` , "band" AS `type`
        FROM `bands`
        WHERE `band_name` LIKE '%$search_term%'
        LIMIT 0 , 5
    )
    UNION ALL (    
        SELECT `user_id` , `username` , "user" AS `type`
        FROM `users`
        WHERE `username` LIKE '%$search_term%'
        LIMIT 0 , 5
    )
    
    if($row["type"] === "band") {
        echo "somelink?band_id=" . $row["band_id"];
    } else {
        echo "somelink?user_id=" . $row["band_id"];
    }
    
    请注意,在这两种情况下,您都需要读取
    $row[“band\u id”]
    ,因为联接将从查询的第一部分获取列名。所有用户id都将位于
    band\u id
    列中


  • 如何在“if语句”或“echo”中使用第二个选项结果如何?我最终选择了第一个选项,但我不得不将其通过两个不同的while循环,使其在用户面前显示所有波段结果。显然这不是一个很好的修复方法,但它很好地工作。有一天它会变得完美。感谢您的帮助。@MitchMullvain如果使用第二个解决方案,您可以使用
    $row['type']
    @MitchMullvain我更新了我的答案,加入了一些示例代码,说明如何使用第二个解决方案;我希望这能让问题更清楚。非常感谢您的帮助。它现在运行得很好,您的建议真的减少了代码。我非常感谢您的帮助。