Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:如何返回从一个节点到下一个节点的移动距离最短的节点列表(只访问每个节点一次)?_Sqlite_Pysqlite - Fatal编程技术网

SQLite:如何返回从一个节点到下一个节点的移动距离最短的节点列表(只访问每个节点一次)?

SQLite:如何返回从一个节点到下一个节点的移动距离最短的节点列表(只访问每个节点一次)?,sqlite,pysqlite,Sqlite,Pysqlite,问题陈述:给定一个初始酒吧位置,返回一个酒吧列表,其中从一个酒吧到另一个酒吧的移动距离最短,而不必访问同一酒吧两次 表格BAR_POS存储我所在区域周围的以下酒吧信息: 唯一\u id(整数) 条形图名称(文本) 纬度(真实) 经度(真实) 我创建了一个函数DIST_SCORE(),它可以在给定一对纬度和经度值的情况下近似计算距离 我甚至计算了一个临时视图,该视图存储了所有条对之间的所有距离(BAR_POS表中只有约100条): 我曾想过使用递归查询,但它不允许在递归select语句中使用M

问题陈述:给定一个初始酒吧位置,返回一个酒吧列表,其中从一个酒吧到另一个酒吧的移动距离最短,而不必访问同一酒吧两次

表格BAR_POS存储我所在区域周围的以下酒吧信息:

  • 唯一\u id(整数)
  • 条形图名称(文本)
  • 纬度(真实)
  • 经度(真实)
我创建了一个函数DIST_SCORE(),它可以在给定一对纬度和经度值的情况下近似计算距离

我甚至计算了一个临时视图,该视图存储了所有条对之间的所有距离(BAR_POS表中只有约100条):

我曾想过使用递归查询,但它不允许在递归select语句中使用MIN(),一个聚合函数,如文档中所述。因此,以下尝试无效!但我希望它能让你了解我正在努力实现的目标

假设初始条具有唯一的_id=14989798357:

WITH RECURSIVE result_tb(id, dist, counter) AS (
       SELECT D.idA+D.idB-14989798357, MIN(D.dist), 0
       FROM dist_matrix AS D
       WHERE D.idA = '14989798357' OR D.idB = '14989798357'

           UNION ALL

       SELECT D.idA+D.idB-result_tb.id, MIN(D.dist), result_tb.counter+1
       FROM dist_matrix AS D, result_tb
       WHERE D.idA = result_tb.id OR D.idB = result_tb.id        
       )

SELECT R.id, B.name
FROM result_tb AS R, bar_pos AS B
WHERE R.id = B.id
那么有没有一种纯SQLite的方法来解决这个问题呢?我知道我可以用其他编程语言轻松地解决这个问题,但我现在正在学习SQLite,并且希望尽可能多地从SQLite学习

以下是BAR_POS表转储的前几行:

CREATE TEMP VIEW 
dist_matrix(idA, idB, dist) AS 
    SELECT A.id, B.id, dist_score(A.lat, A.lon, B.lat,B.lon) AS dist
    FROM bar_pos AS A, bar_pos AS B 
    WHERE A.id > B.id
    ORDER BY dist;
sqlite> .dump bar_pos
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE bar_pos(id INT,name TEXT,lat REAL,lon REAL);
INSERT INTO "bar_pos" VALUES(1127248835,'The Lobby Bar',47.6142099,-122.3198397);
INSERT INTO "bar_pos" VALUES(1194793097,'Comet Tavern',47.6142655,-122.3197336);
INSERT INTO "bar_pos" VALUES(1250696405,'Poco Wine Room',47.6154362,-122.3135746);
INSERT INTO "bar_pos" VALUES(1332014994,'The Saint',47.6176017,-122.3265279);
INSERT INTO "bar_pos" VALUES(1332014999,'Speckled & Drake',47.6166484,-122.3275833);
INSERT INTO "bar_pos" VALUES(1332015004,'Knee High Stocking Co.',47.616968,-122.327413);
INSERT INTO "bar_pos" VALUES(1387947219,'Unicorn Bar',47.6142292,-122.3171081);
INSERT INTO "bar_pos" VALUES(1539274991,'Liberty',47.6235665,-122.3128271);
INSERT INTO "bar_pos" VALUES(1607121865,'Bathtub',47.6130973,-122.3449673);
INSERT INTO "bar_pos" VALUES(1735895574,'Artusi',47.615173,-122.3143967);
INSERT INTO "bar_pos" VALUES(1836754564,'Pioneer Square Saloon',47.6016146,-122.3354445);
INSERT INTO "bar_pos" VALUES(1999272109,'Nitelite',47.611501,-122.3410283);
INSERT INTO "bar_pos" VALUES(2053744069,'Contour',47.6034597,-122.3353422);
INSERT INTO "bar_pos" VALUES(2077248890,'Linda''s',47.6150977,-122.3230019);
INSERT INTO "bar_pos" VALUES(2131716660,'Julia''s',47.621253,-122.3206536);

你能展示一个合适定制的玩具数据库的
.dump
吗?你会满意(我这样理解你的问题)一个列表,其中一个节点和下一个节点之间的距离总是所有剩余节点中最短的?或者你想要一个总距离最短的更复杂的列表,也就是旅行推销员的答案吗?我对旅行推销员的答案不感兴趣。我希望一个节点和下一个节点之间的距离始终是所有剩余节点中最短的。非常感谢您提出这么好的澄清问题!!!!感谢您的确认,抱歉不确定(四个感叹号似乎很恼火)。现在来个
.dump
怎么样?不,我的四个感叹号只是我表达感激的方式,也就是说,我没有生气。这是我第一次问关于堆栈溢出的问题,我应该在这里学习正确的互联网文化/礼仪。谢谢你也指出了这一点。你能展示一个适当定制的玩具数据库的
.dump
吗?你会满意(我这样理解你的问题)一个列表,其中一个节点和下一个节点之间的距离总是所有剩余节点中最短的?或者你想要一个总距离最短的更复杂的列表,也就是旅行推销员的答案吗?我对旅行推销员的答案不感兴趣。我希望一个节点和下一个节点之间的距离始终是所有剩余节点中最短的。非常感谢您提出这么好的澄清问题!!!!感谢您的确认,抱歉不确定(四个感叹号似乎很恼火)。现在来个
.dump
怎么样?不,我的四个感叹号只是我表达感激的方式,也就是说,我没有生气。这是我第一次问关于堆栈溢出的问题,我应该在这里学习正确的互联网文化/礼仪。谢谢你指出这一点。