【问题标题】:Remove rows with same column value删除具有相同列值的行
【发布时间】:2011-04-08 05:28:18
【问题描述】:

我正在从邮政编码表中查询一堆城市。我只想用一个独特的“城市”来获取结果。 (很多城市都有多个拉链。)怎么会这样?

    $query = sprintf("SELECT `Zip`, `City`, `State`, `Lat`, `Long`, 
             ( 3959 * acos( cos( radians('%s') ) * cos( radians( `Lat` ) ) * 
             cos( radians( `Long` ) - radians('%s') ) +
             sin( radians('%s') ) * sin( radians( `Lat` ) ) ) ) AS distance 
             FROM Zips HAVING distance < '%s' ORDER BY distance LIMIT 0 , 18",
      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);

【问题讨论】:

  • 你的mySQL计算距离太复杂了,最好使用deg2rad()sin()cos()acos()等等价的php函数...
  • 你为什么不使用 MySQL 的 Spatial extension dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html
  • 你试过(3959 * acos( cos( radians(%f) ) * cos( radians( Lat ) ) * cos( radians( Long ) - radians(%f) ) + sin( radians(%f) ) * sin( radians( Lat ) ) ) ) AS distance

标签: php mysql unique distinct


【解决方案1】:

您在错误的地方使用HAVING 此处需要WHERE 并使用GROUP BY 按城市对结果进行分组

 $query = sprintf("SELECT `Zip`, `City`, `State`, `Lat`, `Long`, ( 3959 * acos( cos(
 radians('%s') ) * cos( radians( `Lat` ) ) * cos( radians( `Long` ) - radians('%s') ) + sin(
 radians('%s') ) * sin( radians( `Lat` ) ) ) ) AS distance FROM Zips WHERE distance < '%s'  
 GROUP BY City ORDER BY distance LIMIT 0 , 18",

编辑

你也可以试试

     $query = sprintf("SELECT `Zip`, `City`, `State`, `Lat`, `Long`, ( 3959 * acos( cos(
     radians('%s') ) * cos( radians( `Lat` ) ) * cos( radians( `Long` ) - radians('%s') ) + sin(
     radians('%s') ) * sin( radians( `Lat` ) ) ) ) AS distance FROM Zips HAVING distance < '%s'  
     GROUP BY City  ORDER BY distance LIMIT 0 , 18";

$query = sprintf("SELECT * FROM (SELECT `Zip`, `City`, `State`, `Lat`, `Long`, ( 3959 * acos( cos(
     radians('%s') ) * cos( radians( `Lat` ) ) * cos( radians( `Long` ) - radians('%s') ) + sin(
     radians('%s') ) * sin( radians( `Lat` ) ) ) ) AS distance FROM Zips HAVING distance < '%s'  
     ORDER BY distance LIMIT 0 , 18 ) as result_set GROUP BY City";

【讨论】:

  • 您不需要按所有非聚合列分组吗?
  • @Jeffrey: breaks 表示意外结果或任何语法错误?
  • 无效查询:'where 子句'中的未知列 'distance' 整个查询:SELECT Zip, City, State, Lat, Long, ( 3959 * acos( cos(弧度('37'))* cos(弧度(Lat))* cos(弧度(Long)-弧度('-122'))+ sin(弧度('37'))* sin(弧度(Lat))))作为距离距离的拉链
【解决方案2】:

试试

SELECT DISTINCT(city)

GROUP BY (City)

【讨论】:

  • 不可能,如果你做不同的城市,那么显然同名的城市将永远不会返回
  • 实际上, distinct(city) 仍然返回多行。 group by 返回了一个错误
  • 无效查询:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“group by City”附近使用正确的语法
  • 顺序很重要。 GROUP BY 必须出现在HAVING 之前(我使用“GHO(st)”来帮助我记住子句的顺序(Group、Having、Order))。
  • 我记得按字母顺序排列 :)
猜你喜欢
  • 1970-01-01
  • 2022-12-17
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2022-08-11
  • 2022-12-16
  • 2013-03-17
相关资源
最近更新 更多