Veja esta consulta
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
isso é basicamente pesquisar todos os negócios cujo TA.LatLong está na caixa 'MULTIPOINT(-6.2317830813328 106.72621691867,-6.1382169186672 106.81978308133)' e depois disso a caixa deve conter kucing
Isso retorna 22 linhas.
Agora, comparado a esta consulta
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
É a mesma consulta, mas MENOS restritiva. Agora só quero verificar se o negócio está na caixa ou não. É isso. Sim, existem empresas nessas caixas. A maioria dos quais não contém a palavra "kucing*"
Deve haver mais perguntas. No entanto, há menos. A segunda consulta retorna null. A consulta menos restritiva retorna o resultado MENOS.
A resposta de Rolando é boa com uma captura.
Aquele com MATCH (FullTextSearch) AGAINST ('kucing*' IN BOOLEAN MODE) é aquele que funciona corretamente.
Estou perguntando por que aquele sem é problemático. Rolando parece tentar corrigir os corretos.
Nota: (Eu me pergunto se isso deveria ser outra pergunta). Depois de ouvir outros, tentei: Depois de remover
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
retornando 0 linhas
Então eu tentei remover a ordem por e limitar
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
O que também resulta em 0 linhas, finalmente, eu uso a consulta original e certifico-me de remover apenas
AND
MATCH (FullTextSearch) AGAINST ('kucing*' IN BOOLEAN MODE)
transformar resultados de alguns resultados em nenhum resultado
Finalmente eu faço a consulta realmente simples
SELECT BusinessID, Prominent
FROM
tableauxiliary as TA
WHERE
MBRContains(GeomFromText ('MULTIPOINT(-6.2209869856406 106.73701301436,-6.1490130143594 106.80898698564)'),TA.Latlong)
Essa é a consulta mais básica de todos os tempos.
Ainda não retornou nenhum resultado
Ora aqui está um milagre. Eu adiciono 2 caracteres e funciona novamente. Os caracteres que adiciono são =1
SELECT BusinessID
FROM tableauxiliary AS TA
WHERE MBRContains( GeomFromText( 'MULTIPOINT(-6.2209869856406 106.73701301436,-6.1490130143594 106.80898698564)' ) , TA.Latlong )
=1
eu tenho resultado
Acho que é hora de relatar bugs.
O índice FULLTEXT age muito engraçado em relação ao MySQL Query Optimizer. Já escrevi sobre isso antes:
Tente refatorar sua primeira consulta para que a cláusula FULLTEXT e a cláusula Spatial não sejam executadas no mesmo nível do plano EXPLAiN.
Se a segunda consulta (na verdade menos restritiva) retornar zero linhas enquanto a primeira retornar mais de zero linhas, isso é um bug.
Primeiro verifique se você pode reproduzir o erro apenas com a tabela ou não. Se o erro persistir enquanto você remove o
DISTINCT
e/ou o arquivoORDER BY ... LIMIT
.Em seguida, tente escrever o conjunto de instruções (
CREATE
tabelas,INSERT
linhas e as 2 consultas, o mais simplificado possível) que reproduz o erro, para que outros possam testar.Então você pode enviá-lo para o MySQL.