2

全文検索を使用して 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

ご理解いただけると大変助かります。

4

4 に答える 4

3

ifが計算列である場合はscoreWHERE句で使用できません。計算に条件を適用する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)
于 2012-09-13T15:09:44.403 に答える
2

問題はscore、クエリの実行が終了するまで、すべての行の値がわからないことです。したがって、この条項scoreの使用に条件を適用することはできません。WHEREORDER BYすべての結果行が計算された後に実行されるため、問題なく使用できます。

使用してみてください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

このHAVING句は とほとんど同じように動作しますが、結果行が計算されたWHEREに実行されるという違いがあります。この時点で、各結果行の の値がわかり、条件を適用できます。score

ドキュメンテーション:
全文検索: 例を見てくださいHAVING
。SELECT の構文をHAVING使用しています:使用法に関する部分を見てください。

于 2012-09-13T15:24:06.067 に答える
0

編集:間違っている

一重引用符を追加してみてください: as 'score'... その列に指定した名前を認識していないようです。

于 2012-09-13T15:07:05.047 に答える
0

これは 50% のノイズのケースである可能性が非常に高いです。行の 50% 以上にある単語がある場合、mysql はそれをノイズワードと見なし、スコアリング (したがってランキング) の際に無視します。これは、オプションにのみ適用されNATURAL LANGUAGE MODEます。

つまらないことではありませんが、引用符なしで完全にうまく機能するはずです:

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 インストールでも問題なく動作します)

于 2012-09-13T15:07:40.367 に答える