由于简单地删除一个额外的约束,较少限制的查询返回较少的结果

use*_*951 6 mysql mysql-5.5 spatial

看看这个查询

SELECT DISTINCT
  TB.ID,
  TB.Latitude,
  TB.Longitude,
  111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
  `tablebusiness` AS TB
   join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
MBRContains(
   GeomFromText ('MULTIPOINT(-6.2317830813328 106.72621691867,-6.1382169186672  106.81978308133)'),
   TA.Latlong
   )
   AND
MATCH (FullTextSearch) AGAINST ('kucing*' IN BOOLEAN MODE)
ORDER BY
  Distance
LIMIT
  0, 20
Run Code Online (Sandbox Code Playgroud)

这基本上是搜索 TA.LatLong 在 'MULTIPOINT(-6.2317830813328 106.72621691867,-6.1382169186672 106.81978308133)' 框中的所有 biz,并且在该框之后必须包含 ku

这将返回 22 行。

现在将其与此查询进行比较

SELECT DISTINCT
  TB.ID,
  TB.Latitude,
  TB.Longitude,
  111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
  `tablebusiness` AS TB
   join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
MBRContains(
   GeomFromText ('MULTIPOINT(-6.2317830813328 106.72621691867,-6.1382169186672  106.81978308133)'),
   TA.Latlong
   )
ORDER BY
  Distance
LIMIT
  0, 20
Run Code Online (Sandbox Code Playgroud)

这是相同的查询,但限制较少。现在我只想检查业务是否在框中。这就对了。是的,那些盒子里有企业。其中大部分不包含“kucing*”一词

应该有更多的查询。然而还是少了。第二个查询返回 null。LESS 限制性查询返回 LESS 结果。

罗兰多的回答是一球好。

带有 MATCH (FullTextSearch) AGAINST ('kucing*' IN BOOLEAN MODE) 的那个是可以正常工作的那个。

我在问为什么没有的那个有问题。Rolando 似乎试图纠正正确的错误。

注意:(我想知道这是否应该是另一个问题)。听了别人的后,我尝试了:删除不同的

SELECT 
  TB.ID,
  111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
  `tablebusiness` AS TB
  join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
  MBRContains(
        GeomFromText (
            'MULTIPOINT(-6.1939967464102 106.76400325359,-6.1760032535898 106.78199674641)'
            ),
            TA.Latlong) 
AND TA.Prominent >15
ORDER BY
  Distance
LIMIT
  0, 20
Run Code Online (Sandbox Code Playgroud)

返回 0 行

然后我尝试删除订单并限制

SELECT 
  TB.ID,
  111151.29341326*SQRT(pow(-6.185-TB.Latitude,2)+pow(106.773-TB.Longitude,2)*0.98839228980165) AS Distance
FROM
  `tablebusiness` AS TB
  join tableauxiliary as TA on TA.BusinessID=TB.ID
WHERE
  MBRContains(
        GeomFromText (
            'MULTIPOINT(-6.1939967464102 106.76400325359,-6.1760032535898 106.78199674641)'
            ),
            TA.Latlong) 
AND TA.Prominent >15
Run Code Online (Sandbox Code Playgroud)

这也最终导致 0 行我使用原始查询并确保我只删除

    AND
MATCH (FullTextSearch) AGAINST ('kucing*' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

将结果从某些结果变为无结果

最后我让查询变得非常简单

SELECT BusinessID, Prominent
FROM
    tableauxiliary as TA
WHERE
  MBRContains(GeomFromText ('MULTIPOINT(-6.2209869856406 106.73701301436,-6.1490130143594 106.80898698564)'),TA.Latlong)
Run Code Online (Sandbox Code Playgroud)

这是有史以来最基本的查询。

仍然返回无结果

现在这是一个奇迹。我添加了 2 个字符,它再次起作用。我添加的字符是 =1

SELECT BusinessID
FROM tableauxiliary AS TA
WHERE MBRContains( GeomFromText( 'MULTIPOINT(-6.2209869856406 106.73701301436,-6.1490130143594 106.80898698564)' ) , TA.Latlong )
 =1
Run Code Online (Sandbox Code Playgroud)

我得到了结果

我想是时候报告错误了。

ype*_*eᵀᴹ 3

如果第二个(实际上限制较少)查询返回零行,而第一个查询返回多于零行,那么这是一个错误。

首先检查是否可以仅使用表重现错误。如果在删除DISTINCT和/或ORDER BY ... LIMIT.

然后尝试编写重现错误的语句集(CREATE表、INSERT行和 2 个查询,尽可能简化),以便其他人可以测试。

然后就可以提交到MySQL了。