Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 全文Sql查询_Php_Mysql - Fatal编程技术网

Php 全文Sql查询

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会抛出

我正在编写一个使用全文搜索搜索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语句中工作正常。是的,这一条是正确的。添加引号抑制了我的错误,但无法解决它,因为我得到的结果为空。现在它有意义了。谢谢。。。。