返回5公里以内的项目,并连接4个不同的表mysql?

返回5公里以内的项目,并连接4个不同的表mysql?,mysql,join,coordinates,inner-join,Mysql,Join,Coordinates,Inner Join,如何显示5公里以内及以下的项目? 我有4个包含信息的数据库表 第一个表卖方\表conatine卖方信息 第二个表location_表包含卖方拥有门店的国家/城市范围内的区域 第三个表item_表包含卖家商店中提供的产品 最后一个表项设置表包含每个商店的项设置 CREATE TABLE `seller_table` ( `seller_name` VARCHAR(50) NULL DEFAULT NULL, `seller_id` VARCHAR(50) NULL DEFAULT

如何显示5公里以内及以下的项目? 我有4个包含信息的数据库表

第一个表卖方\表conatine卖方信息

第二个表location_表包含卖方拥有门店的国家/城市范围内的区域

第三个表item_表包含卖家商店中提供的产品

最后一个表项设置表包含每个商店的项设置

CREATE TABLE `seller_table` (
    `seller_name` VARCHAR(50) NULL DEFAULT NULL,
    `seller_id` VARCHAR(50) NULL DEFAULT NULL,
    `seller_country` VARCHAR(50) NULL DEFAULT NULL
);

INSERT INTO `seller_table` (`seller_name`, `seller_id`, `seller_country`) 
VALUES ('Peter', 'PP1', 'MY'),  
('John', 'JJ6', 'MY'),  
('Paul', 'PL9', 'SG');

CREATE TABLE `location_table` (
    `loc_name` VARCHAR(50) NULL DEFAULT NULL,
    `loc_id` VARCHAR(50) NULL DEFAULT NULL,
    `loc_lat` VARCHAR(500) NULL DEFAULT NULL,
    `loc_lng` VARCHAR(500) NULL DEFAULT NULL,
    `loc_seller_id` VARCHAR(500) NULL DEFAULT NULL
);

 INSERT INTO `location_table` (`loc_name`, `loc_id`, `loc_lat`, `loc_lng`, `loc_seller_id`) 
 VALUES ('Office CYB', '1A', '2.908810', '101.651398', 'PP1'),  
 ('Office NLI', '1B', '2.725806', '101.942375', 'PP1'),
 ('Outlet S', '3A', '3.051953', '101.671455', 'JJ6');

CREATE TABLE `item_table` (
    `item_name` VARCHAR(50) NULL DEFAULT NULL,
    `item_id` VARCHAR(50) NULL DEFAULT NULL,
    `item_store_ids` VARCHAR(100) NULL DEFAULT NULL,
    `item_seller` VARCHAR(50) NULL DEFAULT NULL
);

 INSERT INTO `item_table` (`item_name`, `item_id`, `item_store_ids`, `item_seller`) VALUES ('Java', '1', '1A, 1B ', 'PP1'), 
  ('PHP', '2', '1A', 'PP1'), 
  ('CSS', '3', '1B', 'PP1'), 
  ('SQL', '4', '1B', 'PP1'),
  ('Python', '5', '3A', 'JJ6'),
  ('HTML', '6', '1A', 'PP1'),
  ('VUE', '7', '1A', 'PP1');


CREATE TABLE `item_setting_table` (
    `set_item_id` VARCHAR(50) NULL DEFAULT NULL,
    `set_item_status` int(1) NOT NULL DEFAULT 1,
    `set_item_store_id` VARCHAR(100) NULL DEFAULT NULL
);

INSERT INTO `item_setting_table` (`set_item_id`, `set_item_status`, `set_item_store_id`) 
VALUES ('1', 1, '1A'), 
  ('2', 1, '1A'), 
  ('3', 1, '1B'), 
  ('4', 1, '1B'),
  ('5', 1, '3A'),
  ('6', 1, '1A'),
  ('7', 0, '1A');
我实际上想做的是,通过连接这4个表,从“位置”表、项目设置表、卖方国家表和项目表中检查门店位置,向同一国家/地区5.5公里以内的用户显示所有产品

我已经尝试了代码,但它没有返回任何数据或显示任何错误

SET @latitude = 2.924860, @longtitude = 101.636941; /*IN RANGE*/
#SET @latitude = 2.802455, @longtitude = 101.79887110000004; /*IN RANGE*/
#SET @latitude = 3.798494, @longtitude = 101.43447100000003; /*OUT OF RANGE*/
SET @KM = 5.5;

SELECT seller.seller_name,loc.loc_name, item.item_name, 
3956 * 2 * ASIN(SQRT(POWER(SIN((loc.loc_lat - ABS(@latitude)) * PI()/180 / 2), 2) + COS(loc.loc_lng * PI()/180 ) * COS(ABS(@latitude) * PI()/180)  * POWER(SIN((loc.loc_lng - @longtitude) * PI()/180 / 2), 2))) AS distance

FROM item_table item
INNER JOIN seller_table seller
ON item.item_seller = seller.seller_id

INNER JOIN location_table loc
ON loc.loc_id = item.item_store_ids

INNER JOIN item_setting_table sett
ON sett.set_item_id = item.item_id
AND sett.set_item_store_id = item.item_store_ids

WHERE seller.seller_country = "MY"
AND sett.set_item_status = 1
HAVING distance <=  @KM 
OR distance IS NULL
ORDER BY distance IS NULL DESC, distance DESC
LIMIT 100
我创造了一个飞盘


请告诉我,我确实需要帮助,或者如果有更好的方法,我会很感激

为什么要将纬度和经度数值存储为varchar?检查此问题及其答案:@MadhurBhaiya仅用于此帖子,我实际上在另一张便笺上使用了float,您的查询运行良好,我无法复制您的问题:@MadhurBhaiya请不要在item.item_seller=seller.seller_idWorks对我来说很好。修复数据类型,并为给定查询提供解释。顺便说一句,我有一个函数geo_distance_km,它减少了此类查询所需的代码量。