【问题标题】:php mysql query like (contains)php mysql查询喜欢(包含)
【发布时间】:2011-08-02 08:02:24
【问题描述】:

我正在尝试通过 db 列中包含的单词过滤 sql 查询。

这是有效的(请不要告诉我Having 是错误的......它不适用于Where)

    $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);

【问题讨论】:

  • printf 你的查询格式真的很复杂,所以请说出你想看的内容。
  • @EmCo:错了。您可以随时使用having。你必须使用group by 的唯一一次是你正在使用聚合函数
  • 我想知道问题是否在于我正在使用 escape_string %s 并且在使用 LIKE 时该字符串通常是 %biology%
  • 如果您在执行此操作时比较两个数字distance &lt; '%s',这可能是您的问题。试试这个:distance &lt; s.
  • 那也没用。是否可以在下面使用第一个查询的结果进行另一个查询?

标签: php mysql sql-like contains


【解决方案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) ."'";

【讨论】:

    【解决方案2】:

    你试过了吗:

    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/

    【讨论】:

    • 无效查询:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'HAVING distance Lat))* cos(弧度(Long)-弧度('-122.740799'))+ sin(弧度('46.986698'))* sin(弧度(Lat))))AS距离FROM Tutors WHERE SubjectList LIKE 'biology' ORDER BY distance HAVING distance
    • 想通了。我不得不删除 sprintf 并使用 '%".$subject."%'
    猜你喜欢
    • 2012-12-23
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多