0

我正在使用 PHP 输出一些 SQL 代码,然后将数据从 JSON 返回到 Ajax,然后从中填充一个下拉列表。这个想法是,如果数据在半径范围内附近,则让电缆编号下拉列表显示多个选项,但我遇到的问题是,如果该半径内有 6 个选项,它会显示相同的值,例如 6 次......对于例如,应该发生的是带有 1、2、3、4 和 5 部分的电缆编号 1000 和带有 1、2、3 和 4 部分的电缆编号 1001 在 50 英尺半径内,因此只有电缆编号 1000 和 1001 应该位于下拉列表中,并且部分编号的处理方式不同(与此问题无关)...问题是下拉列表将显示电缆编号 1000 五次(与 DB 中该电缆编号的部分编号一样多),同样适用于 1001 电缆数字,显示四次,所以现在我在下拉列表中有 9 个电缆号码都是相同的号码。我怎样才能让我的 php/sql 只显示两个电缆号码,并且不显示 9 次?

我认为这种行为的罪魁祸首是因为 HAVING DISTANCE 和半径都不同,所以由于有不同的距离列,那么每行的距离填充相同的电缆编号......

SQL

// Define JSON array
$array = array();

$sql = <<<EOD
SELECT DISTINCT cable_no,
       3959.0 * 5280.0 * acos(sin(radians($lat)) * sin(radians(extraction_worksheet.mh_lat_a))
       + cos(radians($lat)) * cos(radians(extraction_worksheet.mh_lat_a))
       * cos(radians(extraction_worksheet.mh_long_a) - radians($lon))) as distance
 FROM extraction_worksheet
 WHERE extraction_worksheet.mh_lat_a != ''
 HAVING distance <= $radius
EOD;

$result = mysql_query($sql) or die ('Error'.mysql_error());

// If DB query successful then send data to calling routine.
    while ($row = mysql_fetch_array($result)) {
        $array[] = $row;
    }   
        print json_encode($array);

JS

function populate_cableno(latitude, longitude, radius) {
$.ajax({
    type: 'GET',
    url: './php/getcable_number.php',
    data: 'latitude=' + latitude + '&longitude=' + longitude + '&radius=' + radius,
    dataType: 'json',
    success: function (mydata) {

        if (mydata.length >= 1) {
            if (mydata.length > 1) {
                $("#cable_no")
                    .replaceWith('<select onchange="get_co_name(); get_section_no(); return false;" id="cable_no" name="cable_no"></select>');

                var combo = document.getElementById("cable_no");

                while (combo.firstChild) {
                    combo.removeChild(combo.firstChild);
                };

                var option = document.createElement("option");

                for (var i = 0; i < mydata.length; i++) {
                    option = document.createElement("option");
                    option.text = mydata[i]['cable_no'];
                    option.value = mydata[i]['cable_no'];
                    try {
                        combo.add(option, null); //Standard
                    } catch (error) {
                        combo.add(option); // IE only
                    }
                };
                get_co_name();
                get_section_no();
            }
            else {
                document.forms['prepform'].elements['cable_no'].value = mydata[0]['cable_no'];
                get_co_name();
                get_section_no();
            }
        } else {
            alert("There are no cables within a 2000ft radius.");
        }
    },
    error: function () {
        alert("Error...");
    },
    complete: function () {}
});
};
4

1 回答 1

0

好的,我最终发现在 HAVING DISTANCE 之前添加“GROUP BY cable_no”是诀窍。谢谢。

于 2013-06-27T19:01:26.900 回答