2011-04-10 139 views
0

我试图通过包含在db列中的单词来过滤sql查询。php mysql查询like(contains)

这是工作(请不要告诉我有错......它不与凡工作)

$query = sprintf("SELECT *, (3959 * acos(cos(radians('%s')) * cos(radians(`Lat`)) * cos(radians(`Long`) - radians('%s')) + sin(radians('%s')) * sin(radians(`Lat`)))) AS distance FROM Tutors HAVING distance < '%s' ORDER BY distance", 
     mysql_real_escape_string($lat), 
     mysql_real_escape_string($lng), 
     mysql_real_escape_string($lat), 
     mysql_real_escape_string($radius)); 
    $result = mysql_query($query, $dbConn); 

我想补充一点,如:

$query = sprintf("SELECT *, (3959 * acos(cos(radians('%s')) * cos(radians(`Lat`)) * cos(radians(`Long`) - radians('%s')) + sin(radians('%s')) * sin(radians(`Lat`)))) AS distance FROM Tutors HAVING distance < '%s' AND SubjectList like '%s' ORDER BY distance", 
     mysql_real_escape_string($lat), 
     mysql_real_escape_string($lng), 
     mysql_real_escape_string($lat), 
     mysql_real_escape_string($radius), 
     mysql_real_escape_string($subject)); 
    $result = mysql_query($query, $dbConn); 
+0

的printf真复杂的查询格式,所以请告诉你只是想看看。 – SIFE 2011-04-10 02:28:19

+0

@EmCo:错了。你可以随时使用'having'。你唯一一次使用'group by'是你正在使用一个聚合函数 – 2011-04-10 02:37:59

+0

我想知道如果问题是我正在使用escape_string%s并且在使用LIKE时通常是%biology% – Jeffrey 2011-04-10 02:41:51

回答

1

下面是现在工作的解决方案 - 感谢大家的帮助

$query = "SELECT *, (3959 * acos(cos(radians('". addslashes($lat) ."')) * cos(radians(`Lat`)) * cos(radians(`Long`) - radians('". addslashes($lng) ."')) + sin(radians('". addslashes($lat) ."')) * sin(radians(`Lat`)))) AS distance FROM Tutors WHERE `SubjectList` LIKE '%". addslashes($subject) ."%' GROUP BY distance HAVING distance < '". addslashes($radius) ."'"; 
0

你试过:

SELECT *,(formula) AS distance FROM Tutors WHERE SubjectList LIKE '%s' ORDER BY distance HAVING distance < '%s' 

WHERE对所有行都起作用,而HAVING对集合函数起作用,因此您要确保您首先减少了集合公式正在执行的集合。这也将产生更有效的查询。

HAVING与WHERE有时是一个非常棘手的分化,这个环节把它描述得非常好:

http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

+0

无效的查询:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行的'HAVING distance <'30''附近使用正确的语法。整个查询:SELECT *,(3959 * acos(cos(radians('46 .986698'))* cos (弧度('Lat'))* cos(弧度('Long') - 弧度(' - 122.740799'))+ sin(弧度('46 .986698'))* sin(弧度('Lat'))))AS距离FROM TUTORS WHERE SubjectList LIKE'biology'ORDER BY距离HAVING distance <'30' – Jeffrey 2011-04-10 02:36:57

+0

算出来。我必须删除sprintf并使用'%'。$ subject。“%' – Jeffrey 2011-04-10 09:17:34