簡體   English   中英

MySQL全文搜索 - 對同一字段進行多次搜索

[英]MySQL Full Text Search - multiple search for the same field

我有這些表:

|   ID   | detail_id |       detail_value       | book_id |

| ------ | --------- |------------------------- | ------- |

| 1      | 11        | Warszawa                 | 103     |

| 2      | 14        | Grażyńskiego             | 123     |

| 3      | 11        | st.Warszawa m            | 123     |

| 4      | 14        | Michała Grażyńskiego     | 222     |

| 5      | 11        | Warszawa                 | 222     |

| 6      | 14        | Katowicka                | 103     |

| 7      | 9         | 923                      | 23      |

| 8      | 12        | 432424                   | 23      |

| 9      | 14        | Przykładowa              | 23      |

| 10     | 11        | Warszawa                 | 23      |

detail_id : 14 - 這是街道名稱,11 - 這是城市名稱(其他不重要)。

現在,我有兩個短語(由用戶在我的網站上warszawa ): warszawa (detail_id:11 - 這是城市名稱)和grażyń (detail_id:14 - 這是街道名稱的一部分)。

現在我想獲取book_id為 123 和 222 的所有記錄,因為這些記錄包含短語warszawa作為 detail_id = 11 和短語grażyń作為 detail_id = 14。

這是我的 sql 請求:

SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) AND (detail_id = 14 AND MATCH (detail_value) AGAINST ('*grażyń*' IN BOOLEAN MODE))

問題是 - 此請求不返回任何結果。 當我嘗試使用此查詢的一部分時:

SELECT * FROM `table` WHERE detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)

或者:

SELECT * FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('*grażyń*' IN BOOLEAN MODE)

這工作正常,但是當我想組合這些查詢時,我沒有得到任何結果。

問題是 - 此請求不返回任何結果。

你寫了:

SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) AND (detail_id = 14 AND MATCH (detail_value) AGAINST ('*grażyń*' IN BOOLEAN MODE))

在最好的情況下意味着:

WHERE (detail_id = 11) AND (detail_id = 14)

如何在(detail_id = 11)同時包含(detail_id = 11)(detail_id = 14)

您必須使用 join 然后根據您的列進行過濾:

select 
street.book_id,
street.detail_value as street_name,
city.detail_value as city_name
from
(select * from `table` where detail_id = 14) as street
join (select * from `table` where detail_id = 11) as city on city.book_id=street.book_id

結果是:

書名 街道名稱 城市名稱
103 卡托維卡 華沙
123 格拉辛斯基戈 聖華沙米
222 Michała Grażyńskiego 華沙
23 普日克拉多瓦 華沙

現在您可以輕松過濾它

測試一下

select 
street.book_id,
street.detail_value as street_name,
city.detail_value as city_name
from
(select * from `table` where detail_id = 14 and MATCH (detail_value ) AGAINST ('*grażyń*' IN BOOLEAN MODE)) as street
join (select * from `table` where detail_id = 11 and MATCH (detail_value ) AGAINST ('*warszawa*' IN BOOLEAN MODE) ) as city on city.book_id=street.book_id
書號 街道名稱 城市名稱
123 格拉辛斯基戈 聖華沙米
222 Michała Grażyńskiego 華沙

注意:根據桌子的大小決定

您可以使用 extss 但您的查詢實際上返回零行

CREATE TABLE `table` ( `ID` INTEGER, `detail_id` INTEGER, `detail_value` VARCHAR(20), `book_id` INTEGER , FULLTEXT idx (detail_value) ); INSERT INTO `table` (`ID`, `detail_id`, `detail_value`, `book_id`) VALUES ('1', '11', 'Warszawa', '103'), ('2', '14', 'Grażyńskiego', '123'), ('3', '11', 'st.Warszawa m', '123'), ('4', '14', 'Michała Grażyńskiego', '222'), ('5', '11', 'Warszawa', '222'), ('6', '14', 'Katowicka', '103'), ('7', '9', '923', '23'), ('8', '12', '432424', '23'), ('9', '14', 'Przykładowa', '23'), ('10', '11', 'Warszawa', '23');
 SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) AND EXISTS (SELECT 1 FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('*rażyń*' IN BOOLEAN MODE))
\n身份證 |  detail_id |  detail_value | 書號\n -: |  --------: |  :----------- |  ------:\n
SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE))
\n身份證 |  detail_id |  detail_value | 書號\n -: |  --------: |  :------------ |  ------:\n  1 |  11 | 華沙 |  103\n  3 |  11 | 聖華沙米 |  123\n  5 |  11 | 華沙 |  222\n 10 |  11 | 華沙 |  23\n
SELECT 1 as test FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('*rażyń*' IN BOOLEAN MODE)
\n | 測試 |\n |  ---: |\n

db<> 在這里擺弄

更改第二個查詢

SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) AND EXISTS (SELECT 1 FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('grażyń*' IN BOOLEAN MODE))
\n身份證 |  detail_id |  detail_value | 書號\n -: |  --------: |  :------------ |  ------:\n  1 |  11 | 華沙 |  103\n  3 |  11 | 聖華沙米 |  123\n 10 |  11 | 華沙 |  23\n
SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE))
\n身份證 |  detail_id |  detail_value | 書號\n -: |  --------: |  :------------ |  ------:\n  1 |  11 | 華沙 |  103\n  3 |  11 | 聖華沙米 |  123\n  5 |  11 | 華沙 |  222\n 10 |  11 | 華沙 |  23\n
SELECT 1 as test FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('grażyń*' IN BOOLEAN MODE)
\n | 測試 |\n |  ---: |\n |  1 |\n |  1 |\n

db<> 在這里擺弄

好的,作為進一步的約束,兩者都必須具有相同的 bookng _id

 SELECT * FROM `table` t1 WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) AND EXISTS (SELECT 1 FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('grażyń*' IN BOOLEAN MODE) AND book_id = t1.book_id)
\n身份證 |  detail_id |  detail_value | 書號\n -: |  --------: |  :------------ |  ------:\n  3 |  11 | 聖華沙米 |  123\n  5 |  11 | 華沙 |  222\n

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM