[英]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.