1

我正在构建一个购物系统,可以在附近位置查找商品。基本上,每个位置(供应商)在一个名为 Location 的表中都有一个条目,其中包含名称、纬度、经度和其他列......然后有一个项目表,带有一个外键,用于标识项目所属的位置至。

基本上,我想找到用户附近的所有项目:我可以使用以下查询来完成:

但是我想做以下事情 - 随机选择该位置的项目 - 将每个位置的项目数量限制为几个(比如 5 个) - 随机化所有结果,以便它们不会按位置分组

到目前为止,这是我已经完成的必须困难的查询,我正在变得更好,但我非常坚持这个 - 如果非常感谢任何帮助!谢谢你!!

到目前为止,这是我的选择声明:

SELECT Location.idLocation
 , Location.locationName
 , Location.tagline
 , Location.tags
 , Location.shortAddress
 , (3959 * acos(cos(radians('40.181')) * cos(radians(Location.latitude)) * cos(radians(Location.longitude) - radians('-74.0265')) + sin(radians('40.181')) * sin(radians(Location.latitude)))) AS distance
 , Item.idItem
 , Item.dateAdded
 , Item.fidLocation
 , Item.itemName
 , Item.description
 , Item.fullImageName
 , Item.thumbnailImageName
FROM
  Location
INNER JOIN Item
ON Location.idLocation = Item.fidLocation
HAVING distance < '1000'
4

2 回答 2

0
SET @local = 0;
SET @group = 0;

SELECT Location.idLocation
 , Location.locationName
 , Location.tagline
 , Location.tags
 , Location.shortAddress
 , (3959 * acos(cos(radians('40.181')) * cos(radians(Location.latitude)) * cos(radians(Location.longitude) - radians('-74.0265')) + sin(radians('40.181')) * sin(radians(Location.latitude)))) AS distance
 , Item.idItem
 , Item.dateAdded
 , Item.fidLocation
 , Item.itemName
 , Item.description
 , Item.fullImageName
 , Item.thumbnailImageName
 , @level := IF(@group = idLocation, @level+1, 1) AS level
 , @group := idLocation as tempGroup 
FROM
  Location
INNER JOIN Item
ON Location.idLocation = Item.fidLocation
order by idLocation, RAND(),
HAVING distance < '1000' AND level <= 5
于 2013-01-23T20:58:42.053 回答
0

好的。这是基于假设的未经测试的版本。

SELECT
  Location.idLocation,
  Location.locationName,
  Location.tagline,
  Location.tags,
  Location.shortAddress,
  (3959 * acos(cos(radians('40.181')) * cos(radians(Location.latitude)) * cos(radians(Location.longitude) - radians('-74.0265')) + sin(radians('40.181')) * sin(radians(Location.latitude)))) AS distance,
  Item.idItem,
  Item.dateAdded,
  Item.fidLocation,
  Item.itemName,
  Item.description,
  Item.fullImageName,
  Item.thumbnailImageName
FROM Location
  INNER JOIN (select *
          from Item
          order by RAND()
          limit 5) as Item
    ON Location.idLocation = Item.fidLocation
ORDER BY RAND()
HAVING distance < '1000'
于 2013-01-23T20:38:34.177 回答