MySQL存储过程崩溃phpMyAdmin
我正在尝试对MySQL实现标记集群。我的SQL基于来自的php代码。 初始代码中添加了度->弧度->度转换和簇位置计算。我将开始描述层次结构中最低的过程 群集中点计算器:MySQL存储过程崩溃phpMyAdmin,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我正在尝试对MySQL实现标记集群。我的SQL基于来自的php代码。 初始代码中添加了度->弧度->度转换和簇位置计算。我将开始描述层次结构中最低的过程 群集中点计算器: DROP PROCEDURE IF EXISTS map__get_midpoint; DELIMITER $$ CREATE PROCEDURE map__get_midpoint(OUT midpointLatDg FLOAT(10,6), OUT midpointLngDg FLOAT(10,6)) BEGIN SE
DROP PROCEDURE IF EXISTS map__get_midpoint;
DELIMITER $$
CREATE PROCEDURE map__get_midpoint(OUT midpointLatDg FLOAT(10,6), OUT midpointLngDg FLOAT(10,6))
BEGIN
SELECT COUNT(*) INTO @clusterSize_midpoint FROM pointsInCluster;
SET @X=0,@Y=0,@Z=0;
SET @thisLat=0, @thisLng=0;
SET @midpoint_loopcount = 1;
all_points_in_cluster: LOOP
IF @midpoint_loopcount > @clusterSize_midpoint THEN
LEAVE all_points_in_cluster;
END IF;
SELECT lat, lng INTO @thisLat, @thisLng FROM pointsInCluster WHERE id=@midpoint_loopcount;
SET @thisLat=@thisLat * PI() / 180;
SET @thisLng=@thisLng * PI() / 180;
SET @a=COS(@thisLat) * COS(@thisLng);
SET @b=COS(@thisLat) * SIN(@thisLng);
SET @c=SIN(@thisLat);
SET @X=@X+@a;
SET @Y=@Y+@b;
SET @Z=@Z+@c;
SET @midpoint_loopcount = @midpoint_loopcount + 1;
END LOOP;
SET @X = @X / @clusterSize_midpoint;
SET @Y = @Y / @clusterSize_midpoint;
SET @Z = @Z / @clusterSize_midpoint;
SET @midpointHyp = SQRT( @X * @X + @Y * @Y );
SET @midpointLng = ATAN2(@Y, @X);
SET @midpointLat = ATAN2( @Z , @midpointHyp );
SET midpointLatDg = @midpointLat * 180 / PI();
SET midpointLngDg = @midpointLng * 180 / PI();
END $$
DELIMITER ;
群集器:
DROP PROCEDURE IF EXISTS map__cluster;
DELIMITER $$
CREATE PROCEDURE map__cluster(IN zoomLVL INT)
BEGIN
CREATE TEMPORARY TABLE temp_objects_to_cluster (id INT NOT NULL AUTO_INCREMENT, ranking INT, lat FLOAT(10,6), lng FLOAT(10,6), inCluster INT DEFAULT '0', type VARCHAR(300), PRIMARY KEY (id) );
INSERT INTO temp_objects_to_cluster (ranking, lat, lng, type) SELECT ranking, lat, lng, type FROM kidTransitTable;
SET @clusterAccuracy=150000;
SET @DISTANCE=(10000000 >> zoomLVL) / @clusterAccuracy;
SELECT COUNT(*) INTO @amountOfPoints FROM temp_objects_to_cluster;
SET @cluster_allmarkers_loopcount = 1;
allMarkers: LOOP
IF @cluster_allmarkers_loopcount > @amountOfPoints THEN
LEAVE allMarkers;
ELSEIF (NOT EXISTS (SELECT 1 FROM temp_objects_to_cluster WHERE id=@cluster_allmarkers_loopcount AND inCluster=0)) THEN
ITERATE allMarkers;
END IF;
SELECT lat, lng, ranking, type INTO @singleLat, @singleLng, @singleRanking, @singleType FROM temp_objects_to_cluster WHERE id=@cluster_allmarkers_loopcount;
DROP TABLE IF EXISTS pointsInCluster;
CREATE TEMPORARY TABLE pointsInCluster (id INT NOT NULL AUTO_INCREMENT,lat FLOAT(10,6), lng FLOAT(10,6),PRIMARY KEY (id));
SET @cluster_nextmarkers_loopcount = @cluster_allmarkers_loopcount+1;
nextMarkers: LOOP
IF @cluster_nextmarkers_loopcount > @amountOfPoints THEN
LEAVE nextMarkers;
ELSEIF (NOT EXISTS (SELECT 1 FROM temp_objects_to_cluster WHERE id=@cluster_nextmarkers_loopcount AND inCluster=0)) THEN
ITERATE nextMarkers;
END IF;
SELECT lat, lng INTO @targetLat, @targetLng FROM temp_objects_to_cluster WHERE id=@cluster_nextmarkers_loopcount;
SET @pixels = ABS(@singleLat-@targetLat) + ABS(@singleLng-@targetLng);
IF @pixels < @DISTANCE THEN
BEGIN
UPDATE temp_objects_to_cluster SET inCluster=1 WHERE id=@cluster_nextmarkers_loopcount;
INSERT INTO pointsInCluster (lat, lng) VALUES (@targetLat, @targetLng);
END;
END IF;
SET @cluster_nextmarkers_loopcount = @cluster_nextmarkers_loopcount + 1;
END LOOP;
SET @clusterSize=0; SELECT COUNT(*) INTO @clusterSize FROM pointsInCluster;
IF @clusterSize > 0 THEN
BEGIN
INSERT INTO pointsInCluster (lat, lng) VALUES (@singleLat, @singleLng);
CALL map__get_midpoint (@midPointLat, @midPointLng);
INSERT INTO fetchReturnTbl (rowData) VALUES (CONCAT('mapItem//lat:', @midPointLat, '/lng:', @midPointLng, '/size:', @clusterSize+1 ));
END;
ELSE
INSERT INTO fetchReturnTbl (rowData) VALUES (CONCAT('mapItem//lat:', @midPointLat, '/lng:', @midPointLng, '/size:1/ranking:/', @singleRanking,'/type:', @singleType));
END IF;
SET @cluster_allmarkers_loopcount = @cluster_allmarkers_loopcount + 1;
END LOOP;
END $$
DELIMITER ;
是什么导致phpMyAdmin不返回任何内容并在没有错误消息的情况下崩溃?我该怎么修理这些东西?
非常感谢 要明确的是,当您说崩溃时,您的意思是需要在服务器上重新启动MySQL守护程序?sql插入页面显示“加载”,无休止。为了解决这个问题,我在MAMP上停止服务器并重新启动。您是否尝试在mysql控制台客户端中单独测试每个过程?是的。问题似乎围绕着clusterers内部循环(名为nextMarkers)展开。通过删除内部循环来简化clusterer“修复”了clusterer过程,但它并没有真正起到任何作用。想法?删除以下行将使过程正常工作,但显然不会返回所需的结果:
updatetemp\u objects\u to\u cluster SET inCluster=1,其中id=@cluster\u nextmarkers\u loopcount
。思想?
CREATE TEMPORARY TABLE kidTransitTable(ranking INT NOT NULL AUTO_INCREMENT, kid INT, lat FLOAT(10,6), lng FLOAT(10,6), type VARCHAR(100), PRIMARY KEY (ranking));
INSERT INTO kidTransitTable(kid, lat, lng, type) values (1, 20.000000, -8.945313, 'Africa1'), (2, 19.669294, -8.242188, 'Africa2'), (3, 17.671045, -9.472656, 'Africa3'), (4, 51.635621, 10.917969, 'Europe1');
CREATE TEMPORARY TABLE fetchReturnTbl (rowData VARCHAR(300));
CALL map__cluster(1);
SELECT * FROM fetchReturnTbl;