搜尋

首頁  >  問答  >  主體

優先顯示精確匹配的「最佳匹配」的全文搜尋結果,包括聯接表

我必須在查詢中更改哪些內容才能首先獲得精確匹配?

例如,任何人在搜尋表單中輸入快樂歌曲,現在他會得到這個輸出..

快樂的孩子

快樂的日子

快樂的人

歡樂歌

# 快樂站

# ...

這是我的查詢..

SELECT  `artist`, `song`, `genre`, `pass`, `id`
        FROM  `songs`
        JOIN  `artists` USING (`pass`)
        WHERE  MATCH(`artist`) AGAINST("happy song")
          OR  MATCH(`song`, `genre`) AGAINST("happy song")
        ORDER BY  `song` ASC
        LIMIT  0,30
') or die(mysql_error($_connect));```

Thank you!

EDIT 03.07.22
Changed query to:<br>
```$query = mysqli_query($_connect, '
    SELECT  `artist`, `song`, `genre`, `pass`, `id`
        FROM  `songs`
        JOIN  `artists` USING (`pass`)
        WHERE  MATCH(`artist`) AGAINST("happy song")
          OR  MATCH(`song`, `genre`) AGAINST("happy song")
        ORDER BY  `song` = "happy song" DESC
') or die(mysql_error($_connect));```

The output is the same, result with only "song" in the text are above in the result when searched for "happy song"

**EDIT 14.7.22**
**Table Artists:**

CREATE TABLE `artists` (
  `artist` varchar(40) NOT NULL,
  `pass` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PACK_KEYS=1;

ALTER TABLE `artists`
  ADD PRIMARY KEY (`pass`),
  ADD UNIQUE KEY `uni_que` (`artist`) USING BTREE;
ALTER TABLE `artists` ADD FULLTEXT KEY `full_txt` (`artist`);
COMMIT;

**Table Songs:**

    CREATE TABLE `songs` (
      `song` varchar(80) NOT NULL,
      `tags` varchar(40) NOT NULL,
      `style` varchar(20) NOT NULL,
      `pass` bigint(20) UNSIGNED NOT NULL,
      `id` bigint(20) UNSIGNED NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PACK_KEYS=1;
    
    ALTER TABLE `songs`
      ADD PRIMARY KEY (`id`);
    ALTER TABLE `songs` ADD FULLTEXT KEY `song` (`song`,`tags`,`style`);
    COMMIT;

P粉002572690P粉002572690316 天前461

全部回覆(1)我來回復

  • P粉116654495

    P粉1166544952024-03-30 00:57:29

    您目前正在要求使用 ORDER BY 歌曲 ASC 按字母順序排序

    更改為 ORDER BY MATCH(...) AGAINST(...) DESC

    #這可能會將「一首關於快樂孩子的歌曲」放在第一位。也就是說,如果你首先需要“歡歌”,我們就需要更加努力:

    SELECT ...
        FROM ...
        WHERE ...
        ORDER BY song = "happy song" DESC,
                 MATCH(...) AGAINST (...)

    (由於您有 OR 並涉及多個列,因此查詢可能會變得相當混亂。)

    如果您不想要只有一個單字的歌曲,請參閱 運算符,或

    MATCH(song) AGAINST('+"happy song"')

    注意引號的有意使用。

    回覆
    0
  • 取消回覆