Warm tip: This article is reproduced from serverfault.com, please click

php-MySQL 全文搜索

(php - MySQL Full Text Search)

发布于 2021-10-13 19:12:41

我有这些表:

|   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 - 这是城市名称(其他不重要)。

现在,我有两个短语(用户在我的网站上写的):( warszawadetail_id:11 - 这是城市名称)和grażyń(detail_id:14 - 这是街道名称的一部分)。

现在我想获取book_id123 和 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)

这很好,但是当我想组合这些查询时,我没有得到任何结果。

Questioner
Pavvcio
Viewed
0
nbk 2021-10-14 04:27:35

你可以使用 extss 但 youtrr 查询实际上返回零行

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))
身份证 | detail_id | 细节值 | book_id
-: | --------: | :----------- | ------:
SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) 
身份证 | detail_id | 细节值 | book_id
-: | --------: | :------------ | ------:
 1 | 11 | 华沙 | 103
 3 | 11 | 圣华沙 123
 5 | 11 | 华沙 | 222
10 | 11 | 华沙 | 23
SELECT 1 as test FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('*rażyń*' IN BOOLEAN MODE)
| 测试 |
| ---: |

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))
身份证 | detail_id | 细节值 | book_id
-: | --------: | :------------ | ------:
 1 | 11 | 华沙 | 103
 3 | 11 | 圣华沙 123
10 | 11 | 华沙 | 23
SELECT * FROM `table` WHERE (detail_id = 11 AND MATCH (detail_value) AGAINST ('*warszawa*' IN BOOLEAN MODE)) 
身份证 | detail_id | 细节值 | book_id
-: | --------: | :------------ | ------:
 1 | 11 | 华沙 | 103
 3 | 11 | 圣华沙 123
 5 | 11 | 华沙 | 222
10 | 11 | 华沙 | 23
SELECT 1 as test FROM `table` WHERE detail_id = 14 AND MATCH (detail_value) AGAINST ('grażyń*' IN BOOLEAN MODE)
| 测试 |
| ---: |
| 1 |
| 1 |

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)
身份证 | detail_id | 细节值 | book_id
-: | --------: | :------------ | ------:
 3 | 11 | 圣华沙 123
 5 | 11 | 华沙 | 222

db<>在这里摆弄