我用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英里。
答案 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;