嗨,我有一个MYSQL搜索的大问题。 我的数据库TABLE如下所示:
+------+----------+------+
| id | keywords | file |
+------+----------+------+
在关键字处,每个条目都有许多关键字与逗号分隔。 (关键字1,关键字2 ...)。
在PHP数组中列出了一些关键字(5-10)。 我的搜索必须从这些关键字获得所有至少3个数据库条目。 它不需要得到所有这些词!但它只能用一个就行不了。
有人可以帮我查询一下吗?我不知道如何制作它。
答案 0 :(得分:2)
这是一个挑战。强力方法是在带有计数的子查询中使用UNION。
例如,
select id, file, count(*) from
(select distinct id, file
from file_table
where FIND_IN_SET(keyword1, keywords)
UNION ALL
select distinct id, file
from file_table
where FIND_IN_SET(keyword2, keywords)
UNION ALL
select distinct id, file
from file_table
where FIND_IN_SET(keyword3, keywords)
UNION ALL
select distinct id, file
from file_table
where FIND_IN_SET(keyword4, keywords)
.... MORE UNION ALL ....) as files
group by id, file
having count(*) >= 3
更高效的是,您可以拥有一个包含关键字和ID的单独表格,每行一个关键字/ ID组合。这将消除通配符搜索并使查询更有效。
下一步是去ElasticSearch这样的东西并过滤结果的分数。
答案 1 :(得分:0)
如果您有此设置:
表格文件:
+------+-------+
| id | file |
+------+-------+
| 1000 | foo |
| 1001 | bar |
+------+-------+
表关键字:
+----+-------+
| id | word |
+----+-------+
| 9 | lorem |
| 10 | ipsum |
+----+-------+
表格文件关键字:
+----+--------+--------+
| id | fileid | wordid |
+----+--------+--------+
| 1 | 1000 | 9 |
| 2 | 1000 | 10 |
| 3 | 1001 | 10 |
+----+--------+--------+
您可以找到包含关键字lorem
,ipsum
,dolor
的文件,如下所示:
SELECT COUNT(DISTINCT(k.word)), f.*
FROM files f
INNER JOIN filekeywords fk
ON fk.fileid = f.id
INNER JOIN keywords k
ON k.id = fk.wordid
WHERE k.word in ('lorem', 'ipsum', 'dolor')
GROUP BY f.id
HAVING COUNT(DISTINCT(k.word)) >= 3