这可能是一个常见的问题,但我甚至不确定我是否做了正确的搜索。
我有一个非常大的查询,它以特定的顺序从不同的表中返回大量数据,并由某些子句过滤掉。我把它放在一个表中,每页加载100行。为此,我使用这样的东西:
SELECT lot_of_data_columns
FROM many_tables
WHERE many_clauses
ORDER BY some_column DESC
LIMIT (page_number * 100), 100
现在我想实现一个搜索字段来查找某个列中的值。如果此值存在,它将加载包含该行的页面。我只想要第一个显示价值的页面。
我正在考虑这样的事情,以按照显示的顺序获取行号:
SELECT row
FROM ( BIG_QUERY,
@curRow := @curRow + 1 AS row
FROM table, (SELECT @curRow := 0) r
) t
WHERE MATCH (column)
AGAINST ('value' IN BOOLEAN MODE)
LIMIT 1
它有效,但只有一些列和行,在其他情况下,即使值存在,它也不会返回任何内容。
有什么建议吗?也许我对我的查询感到有些失望。有更简单的解决方案吗?
更新
问题似乎是一些搜索值。我有一些像这样的价值观:
203-21
201-434
343-23
MATCH 会忽略特殊字符,例如' - ',并忽略接下来的内容,因此lenght一词小于4,这是 MATCH的最小单词长度即可。解决方案是更改 my.conf 文件中的 ft_min_word_len 值。或者使用以下方法从搜索到的值中删除特殊字符:
REPLACE(column, '-', '_')
我仍然希望能够更轻松地解决所有这些问题。如果有人有更好的想法会很棒。
更新2
而不是 MATCH - AGAINST 我改为 REGEXP 。像这样:
SELECT row
FROM ( BIG_QUERY,
@curRow := @curRow + 1 AS row
FROM table, (SELECT @curRow := 0) r
) t
WHERE (column REGEXP '.*value.*')=1
LIMIT 1
它已经工作正常了。但是当增加行数时,我有点担心性能。我会选择知道如何优化查询的人的答案。