1

近くの商品を探すショッピングシステムを構築しています。基本的に、各場所(ベンダー)には、場所と呼ばれるテーブルにエントリがあり、名前、緯度、経度などの列があります。次に、アイテムのテーブルがあり、アイテムが属する場所を識別する外部キーがあります。に。

基本的に、ユーザーの近くにあるすべてのアイテムを検索したいと思います。これは、以下のクエリで実行できます。

ただし、次のことを行いたいと思います-場所からランダムにアイテムを選択します-各場所からのアイテムの数を少数(たとえば5)に制限します-すべての結果をランダム化して、場所ごとにグループ化されて表示されないようにします

これは私が行った非常に難しいクエリであり、私は良くなっていますが、これに固執しています-非常に感謝しているならどんな助けでも!ありがとうございました!!

これまでの私のselectステートメントは次のとおりです。

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

OK。これは仮定に基づいたテストされていないバージョンです。

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 に答える
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 に答える