Php 全文Sql查询
我正在编写一个使用全文搜索搜索mysql表的查询:Php 全文Sql查询,php,mysql,Php,Mysql,我正在编写一个使用全文搜索搜索mysql表的查询: select title, MATCH(title,sidebarTxt,introTxt,fullTxt) AGAINST ('MY KEYWORDS' IN NATURAL LANGUAGE MODE) AS score from tbl_news where (status='published') order by score DESC 上述查询工作正常。但是,如果我试图在where子句中使用'score',MySql会抛出
select title,
MATCH(title,sidebarTxt,introTxt,fullTxt) AGAINST ('MY KEYWORDS' IN NATURAL LANGUAGE MODE) AS score
from tbl_news
where (status='published')
order by score DESC
上述查询工作正常。但是,如果我试图在where子句中使用'score',MySql会抛出错误“#1054-where子句中的未知列'score'。下面是不起作用的代码:
select title,
MATCH(title,sidebarTxt,introTxt,fullTxt) AGAINST ('MY KEYWORDS' IN NATURAL LANGUAGE MODE) AS score
from tbl_news
where status='published' and score > 0
order by score DESC
如果您能帮助我理解,我将不胜感激。编辑:错误
尝试将单引号添加到:
作为“score”
…它似乎无法识别您指定该列为的名称。这很可能是50%的噪声情况。当您有一个单词在50%或更多行中时,mysql会将其视为噪声单词,并在评分时忽略它(因此排名)。这仅适用于自然语言模式
选项
不是吹毛求疵,但它应该在没有任何引用的情况下工作得很好:
mysql> select * from table1;
+---------+------+------+-------------+
| autonum | ID | name | metavalue |
+---------+------+------+-------------+
| 1 | 1 | Rose | Drinker |
| 2 | 1 | Rose | Nice Person |
| 3 | 1 | Rose | Runner |
| 4 | 2 | Gary | Player |
| 5 | 2 | Gary | Funny |
| 6 | 2 | Gary | NULL |
| 7 | 2 | Gary | Smelly |
+---------+------+------+-------------+
7 rows in set (0.00 sec)
mysql> select ID, group_concat(coalesce(metavalue,'Empty')) as Test from table1 group by ID order by Test;
+------+----------------------------+
| ID | Test |
+------+----------------------------+
| 1 | Drinker,Nice Person,Runner |
| 2 | Player,Funny,Empty,Smelly |
+------+----------------------------+
2 rows in set (0.01 sec)
mysql> select ID, group_concat(coalesce(metavalue,'Empty')) as Test from table1 group by ID order by Test desc;
+------+----------------------------+
| ID | Test |
+------+----------------------------+
| 2 | Player,Funny,Empty,Smelly |
| 1 | Drinker,Nice Person,Runner |
+------+----------------------------+
2 rows in set (0.00 sec)
Server version: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)
(这种查询在我的Windows 5.1.x工作时安装时也能很好地工作)如果
score
是计算列,则不能在WHERE
子句中使用score
。必须在另一个HAVING
子句中设置它以在计算后应用条件:
SELECT title,
MATCH(title,sidebarTxt,introTxt,fullTxt)
AGAINST ('MY KEYWORDS' IN NATURAL LANGUAGE MODE) AS score
FROM tbl_news
WHERE status='published'
HAVING score > 0
ORDER BY score DESC;
一个测试用例(使用不同的表)。这里的host
是一个列,host2
是一个派生列。当然,列派生和选择是虚假的,没有什么意义:
mysql> use mysql;
Database changed
mysql> select host, UPPER(host) as host2 FROM user WHERE host = 'nottingham';
+------------+------------+
| host | host2 |
+------------+------------+
| nottingham | NOTTINGHAM |
+------------+------------+
1 row in set (0.00 sec)
mysql> select host, UPPER(host) as host2 FROM user WHERE host = 'nottingham' AND host2 = 'NOTTINGHAM';
ERROR 1054 (42S22): Unknown column 'host2' in 'where clause'
mysql> select host, UPPER(host) as 'host2' FROM user WHERE host = 'nottingham' AND host2 = 'NOTTINGHAM';
ERROR 1054 (42S22): Unknown column 'host2' in 'where clause'
mysql> select host, UPPER(host) as `host2` FROM user WHERE host = 'nottingham' AND host2 = 'NOTTINGHAM';
ERROR 1054 (42S22): Unknown column 'host2' in 'where clause'
mysql> select host, UPPER(host) as host2 FROM user WHERE host = 'nottingham' HAVING host2 = 'NOTTINGHAM';
+------------+------------+
| host | host2 |
+------------+------------+
| nottingham | NOTTINGHAM |
+------------+------------+
1 row in set (0.00 sec)
问题是在查询完成运行之前,所有行的
score
值都是未知的。因此,使用WHERE
子句对score
应用条件是不可能的。在计算完所有结果行之后执行ORDER BY
,因此使用它没有问题
尝试使用拥有:
SELECT title, MATCH(title,sidebarTxt,introTxt,fullTxt) AGAINST ('MY KEYWORDS' IN NATURAL LANGUAGE MODE) AS score
FROM tbl_news
WHERE status='published'
HAVING score > 0
ORDER BY score DESC
HAVING
子句的行为几乎类似于WHERE
,在计算完结果行后执行的差异。此时,每个结果行的得分值都是已知的,并且可以应用该条件
文档:
:查看示例,它们使用HAVING
:看一看关于拥有用法的部分,它给了我以下错误:#1054-where子句中的未知列“score”。thanx你试图给你这个错误的where子句是什么?请给我们你正在做的给出错误的查询。@ilight是正确的。这按预期工作。是的,我不确定发布的是什么他知道的代码可以帮助我们帮助他。我们需要“损坏”的代码来“修复”它。我的问题中没有写“where”子句。如果我这样写查询:“。。。。从tbl_新闻,其中状态='published'和分数>0,按分数顺序描述“,然后在'where子句中出现错误”未知列'score'“是的……非常感谢……过去两个小时我一直在努力工作,你的建议挽救了我的生命。谢谢你……没问题……像这样的问题总是让我难受。如果你在一件事上做得太努力了,让别人看一下会很有帮助:)有趣的是,我从来没有用别名在我的订单上加引号,而且效果很好。。。该死的,现在我得试着弄明白为什么会这样:(如果您冒险使用保留字,建议您这样做;通常会使用反勾号,好吧。我承认,我倾向于两者都不使用…@sudip,您可以尝试使用吗?它在一个更简单的设置中对我有效,所以我不知道我是否正确,或者仅仅是幸运。@ilight添加引号抑制了我的错误,但无法解决它,因为我得到的结果是空的。请看一看lserni先生的帖子。我必须使用having子句,因为分数是一个计算列。不……这不是50%的噪音。我必须添加单引号(可能也是双引号)关于“分数”。@亮起什么双引号?问题中没有任何引号,列别名在order by语句中工作正常。是的,这一条是正确的。添加引号抑制了我的错误,但无法解决它,因为我得到的结果为空。现在它有意义了。谢谢。。。。