У меня есть таблица с именем Сообщения, где одна запись содержит то же, что и следующее:
longtitude = 4.867478333333334
latitude = 52.31819833333334
username = 'pb'
Если я сделаю запрос к таблице с ниже:
$longitude=4.867478333333334
$latitude=52.31819833333334
$username='pb'
$search=''
$visibledistance=2
используя следующий запрос mysql:
$query=("SELECT
subject,username,message,timestamp,(
6371 * acos (
cos ( radians('$latitude') )
* cos( radians( Messages.latitude ) )
* cos( radians( Messages.longitude ) - radians('$longitude') )
+ sin ( radians('$latitude') )
* sin( radians( Messages.latitude ) )
)
) AS distance FROM Messages WHERE username ='pb' AND ((subject LIKE '%$search%') OR (message LIKE '%$search%')) GROUP BY subject
HAVING distance < '$visibledistance'
ORDER BY timestamp");
$sth = mysql_query($query);
Я не получаю результатов. Если я удаляю расстояние < ‘$ visibledistance’ Я получаю все записи, соответствующие оставшимся критериям, так что нет ничего плохого ни в чем, кроме его части расстояния. Может ли кто-нибудь помочь мне понять, как я могу сделать это правильно?
Спасибо!
если у вас есть числовое значение, вы должны избегать одинарных кавычек вокруг переменных
и вы должны использовать Concat для как
(если вы используете ‘$ visibledistance’, вы HAVING distance < '4'
(Вы оцениваете расстояние до строки)
Глядя на ваш код
вы не используете функцию агрегирования, поэтому вам не нужно иметь возможность использовать where (но noy alias) для fliter и distcint вместо группировки по
$query=("SELECT distinct
subject,username,message,timestamp,(
6371 * acos (
cos ( radians($latitude) )
* cos( radians( Messages.latitude ) )
* cos( radians( Messages.longitude ) - radians($longitude) )
+ sin ( radians($latitude) )
* sin( radians( Messages.latitude ) )
)
) AS distance FROM Messages WHERE username ='pb' AND ((subject LIKE concat('%', '$search', '%')
OR (message LIKE concat('%','$search','%'))
WHERE (
6371 * acos (
cos ( radians($latitude) )
* cos( radians( Messages.latitude ) )
* cos( radians( Messages.longitude ) - radians($longitude) )
+ sin ( radians($latitude) )
* sin( radians( Messages.latitude ) )
)
) < $visibledistance
ORDER BY timestamp");
Других решений пока нет …