【问题标题】:sql query to search from 2 fields mysql Fulltextsql查询从2个字段搜索mysql全文
【发布时间】:2014-12-10 03:09:25
【问题描述】:

我有一个在数据库中搜索歌曲的搜索,目前他们可以按艺术家或歌曲名称搜索。所以目前他们可以搜索 tom jones 或它并不罕见,他们无法搜索 tom jones 不寻常。如何使这成为可能我当前的 SQL 看起来像这样

SELECT * 
FROM songs  
WHERE artist LIKE '%$search%' 
   OR songname LIKE '%$search%' 
LIMIT 6

我已将全文搜索添加到艺术家和歌曲名称列。无法弄清楚如何在两行上进行搜索。

【问题讨论】:

  • 您是否尝试将 WHERE 子句中的 OR 更改为 AND?
  • 使用 AND 会使它需要在两个字段中,我需要它以便它可以在其中一个或两个中,而不仅仅是在两个字段中。如果是 and 并且用户只搜索两个字段中带有 to 的项目,则会显示即 Elton John - Step to Christmas。因为这两个字段都包含到
  • 您可能想要全文搜索。
  • 干杯 Gornon Linoff 全文似乎是使这成为可能的方式

标签: mysql


【解决方案1】:

您似乎正在使用tom jones unusual 作为搜索文本'$search'。当您在mysql 中使用like 时,它将在给定字段中搜索文本模式,但是当您输入tom jones unusual 作为搜索文本时,不会出现此类文本。因为tom jones 在一个字段中,而unusual 在另一个字段中

你可以做以下事情来完成你想做的事

  • 获取完整搜索文本tom jones unusual
  • 将搜索文本从空格中拆分为单独的变量,例如 $ser1 = tom; $ser2 = jones; $ser3 = unusual;
  • 然后在mysql 中执行类似的操作

select * from song where artist like '%$ser1%' or '%$ser2%' or '%$ser3%' or songname like '%$ser1%' or '%$ser2%' or '%$ser3%'

【讨论】:

  • 这可行,但无法缩小搜索结果的范围,假设我搜索海滩男孩,它会给我所有海滩男孩的歌曲。如果我然后添加我到处走,所以我的搜索现在是海滩男孩,我到处走,我仍然会得到所有包含海滩男孩的歌曲,但不是我到处走。通过阅读文档,我认为全文搜索是我无法弄清楚如何使用它的解决方案
【解决方案2】:

解决方案是使用全文搜索。您首先需要定义要在全文搜索中使用的行,您可以使用以下 mysql 命令执行此操作

ALTER TABLE  songs 
ADD FULLTEXT(artist, songtitle)

然后是sql查询

$sql = "SELECT * FROM songs WHERE MATCH (songname, artist) AGAINST ('$search')  LIMIT 6";

这将仅在有匹配的单词时返回结果,如果您想要在输入完整单词之前得到类似的结果,您可以这样做。

$sql = "SELECT * FROM songs WHERE MATCH (songname, artist) AGAINST ('$search' IN BOOLEAN MODE)  LIMIT 6";
$sqllike = "SELECT * FROM songs  WHERE artist like '%$search%' OR songname like '%$search%' LIMIT 6";
$result = mysqli_query($con, $sql);
$resultlike = mysqli_query($con, $sqllike);

if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
        echo "<a href='". $row["songid"] . "' class='songclicker'>";
        echo "<div class='song whitefont'>";
        echo "<img src='" . $row["artwork"]."' class='songimage'>";
        echo "<p>". $row["songname"] . "</p>";
        echo "<p>". $row["artist"] . "</p></div>";

    }
    echo "<a href='". urlencode($search) ."'><h1 class='seeall'>See all search results</h1></a>";
} else {
    if (mysqli_num_rows($resultlike) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($resultlike)) {
        echo "<a href='". $row["songid"] . "' class='songclicker'>";
        echo "<div class='song whitefont'>";
        echo "<img src='" . $row["artwork"]."' class='songimage'>";
        echo "<p>". $row["songname"] . "</p>";
        echo "<p>". $row["artist"] . "</p></div>";

    }

    echo "<a href='searchresults.php'><h1 class='seeall'>See all search results</h1></a>";
} else {
    echo "0 results";
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多