MySQL存储过程崩溃phpMyAdmin

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

我正在尝试对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

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;