1

この最初のクエリが機能し、この 2 番目のクエリが機能しない理由を誰かが知っていますか?

最初のクエリ (作品):

SELECT *, 
       MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) AS _score
FROM (ci_users) HAVING _score > '0';

2番目のクエリ(機能していません):

SELECT COUNT(id), 
       MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) AS _score 
FROM (ci_users) HAVING _score > '0';

*最初のクエリは正確に 24 行を返し、2 番目のクエリは 0 行を返します。COUNT(id)

4

1 に答える 1

2

最初のものは、一致するすべての行を返します。

2 番目のものには、id の集計が含まれています。

集計するとき、MySQL は、照会されたが集計されていないすべてのフィールドから任意の値を暗黙的に選択するのに十分スマートです (または、愚かであると言うべきです)。したがって、 group byscoreも aggregate も使用しないため、MySQL は値が 0 のものを含むscore中間結果 (句を適用する前) のすべてのレコードのスコアを返すだけです。having結果には、たとえば 900 のカウントと _score の 0 だけが含まれる可能性があります。 を使用してフィルタリングした後having、レコードは残りません。

さて、喜んで提案をさせていただきますが、そのクエリから実際に何を返したいのかわかりません。

SELECT COUNT(id)
FROM
  (SELECT 
    id,
    MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) AS _score 
  FROM (ci_users) HAVING _score > '0') x;

またはさらに良い:

SELECT COUNT(id)
FROM (ci_users) 
WHERE MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) > '0'
于 2012-11-03T10:38:18.657 に答える