2016-11-01 60 views
1

这是我的问题:我有两个表 - 邮编表和供应商表。 我想要做的是,当我输入一个邮政编码时,让某个半径范围内的所有供应商(基于他们的邮政编码)。我到目前为止工作。MySQL更改返回值

但这是事情。我需要根据距离划分结果。我需要有几个团队:10英里以内,50英里以内,100英里以内。我想要做的(如果可能的话)是将10英里以下的所有值更改为10,11到50到50之间的所有值以及51和100之间的所有值到100。

到目前为止,我的查询返回正确的结果。我需要帮助如何用我需要的距离替换实际的距离值。

SELECT SQL_CALC_FOUND_ROWS 
    3959 * 2 * ASIN(SQRT(POWER(SIN((:lat - zipcodes.zip_lat) * pi()/180/2), 2) + COS(:lat * pi()/180) * COS(zipcodes.zip_lat * pi()/180) * POWER(SIN((:lon - zipcodes.zip_lon) * pi()/180/2), 2))) AS distance, 
    vendors.* 
FROM 
    guzaba_vendors AS vendors 
INNER JOIN guzaba_zipcodes AS zipcodes ON zipcodes.zip_code = vendors.vendor_zipcode 
WHERE 
    vendors.vendor_status != 4 
GROUP BY 
    vendors.vendor_id 
HAVING distance < 100 

回答

1

使用CASE EXPRESSION

SELECT t.*, 
     CASE WHEN t.distance < 10 THEN 10 
      WHEN t.distance between 11 and 50 THEN 50 
      ELSE 100 
     END as new_distance 
FROM (Your Query Here) t 
+0

谢谢!正是我在找什么! – darighteous1

1

添加一个新列到你的SELECT - 第一部分包含数字来表示距离:

3 - >内10英里

2 - > 50英里以内

1 - > 100英里以内小号

代码:

CAST((distance < 10) AS SIGNED INTEGER) + CAST((distance < 50) AS SIGNED INTEGER) + CAST((distance < 100) AS SIGNED INTEGER) AS goodName 
+0

我想这也是一个解决方案,但它并不能完美地满足我的需求。我以后需要10个50和100个键,所以我可以将数据填充到不同的数组中并处理它。感谢您的快速回复! – darighteous1