区别不正常

时间:2013-02-19 17:49:21

标签: mysql sql distinct having

我用DISTINCT编写了一个查询,但我仍然会收到重复的记录。

SELECT DISTINCT
  `cuisine_types`.`id`, 
  `cuisine_types`.`name`, 
  `cuisine_types`.`image`, 
  (
    SELECT group_concat(`tagname` separator ', ') 
    FROM `cuisine_tags` 
    WHERE `cuisine_type` = `cuisine_types`.`id` 
  ) AS tags, 
  (
    3959 * acos( cos( radians(" . $dLat . ") ) * cos( radians( gps_lat ) ) * cos( radians( gps_lon ) - radians(" . $dLon . ") ) + sin( radians(" . $dLat . ") ) * sin( radians( gps_lat ) ) )
  ) AS distance 
FROM `company` 
LEFT JOIN `cuisine_types` 
ON 
    `company`.`cuisine_type_id` = `cuisine_types`.`id` 
HAVING 
    distance < " .$dMiles

当我尝试使用GROUP BY函数时,我的查询无法正常工作。 当我使用GROUP BY时,我将其放在HAVING

之上
GROUP BY `cuisine_types`.`name`

示例:

当我使用这些值时:

$dLat = '52.779716';
$dLon = '21.84803';
$iKm = '30';

它返回:

id = 1
name = Snackbar
image = 
tags = Patat, Snacks
distance = 17.4713944772963

当我将$iKm与3000一起使用时,它也会返回此行:

id = 1
name = Snackbar
image =
tags = Patat, Snacks
distance = 722.407714147792

所以我得到两条记录。 当我使用groupby和$iKm = 30时;它什么都不返回。值为3000时,返回一行。但我有一条距离为17英里的记录,因此低于30英里。

1 个答案:

答案 0 :(得分:1)

这应该可以解决您的问题,问题是距离计算阻止了GROUP BY功能。通过将等式放在HAVING本身,问题似乎是固定的。对不起,我无法详细解释。

SELECT 
            `cuisine_types`.`name`,
            `cuisine_types`.`id`,
             `cuisine_types`.`image`
            `c`.`gps_lat` as lat,
            `c`.`gps_lon` as lon,
            (SELECT group_concat(`tagname` separator ', ') FROM `cuisine_tags`  WHERE `cuisine_type`=`cuisine_types`.`id`) as tags FROM `company` as c  LEFT JOIN `cuisine_types` ON c.`cuisine_type_id`
= `cuisine_types`.`id` GROUP BY `cuisine_types`.`name` HAVING  ( 3959 * acos( cos( radians(52.779716) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(21.84803) ) + sin( radians(52.779716) ) * sin( radians( lat ) ) ) ) < 2000;