使用php检查数据库中两个范围是否相交

pkwftd7m  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(345)

我有一个数据库,它有两列left\ u from和left\ u to我需要基本上检查数据库中每一行的两列,看看是否有重叠的范围。假设有37行返回,我需要检查每行37次。我已经尝试过使用范围和多个循环的array\u intersect()。我也尝试过mysql中的between,但这也能满足我的需要。当我尝试between方法时,我有两个循环,我认为可以接受这两个

$newstart[$crow] = $row['LEFT_FROM'];
        $newend[$crow] = $row['LEFT_TO'];

并将它们与新数据进行比较,因为$row2,新数据将循环37次。

//attempt at BETWEEN
    $newstart = array();
        $newend = array();
        $crow = 0;
        while ($row = mysqli_fetch_array($get)) {
            $newstart[$crow] = $row['LEFT_FROM'];
            $newend[$crow] = $row['LEFT_TO'];

                while ($row2 = mysqli_fetch_array($get)) {

                    $newsql = "SELECT * FROM database+table WHERE tablename = 'something' AND
                    LEFT_FROM BETWEEN " . $newstart[$crow] . " AND " . $newend[$crow] . " OR  
                    LEFT_TO BETWEEN " . $newstart[$crow] . " AND " . $newend[$crow] . " OR ".
                    $newstart[$crow] . " BETWEEN " .  "LEFT_FROM" . " AND ". " LEFT_TO";
                    $result = mysqli_query($GLOBALS['Con'], $newsql);
                    if (!$result) {
                        echo "Error: " . mysqli_error($GLOBALS['Con']) . "<br>";
                    }
                    if (!empty($result)) {
                        echo "Overlap: ". "Row2 LEFT_FROM: " . $row2['LEFT_FROM'] . " NewStart: " . $newstart[$crow] . " Row2 LEFT_TO: " . $row2['LEFT_TO'] . " Newend: " . $newend[$crow] . "<br>" . "Crow: " . $crow . "<br>" ;
                    }
                }

        echo "Crow: " . $crow . "<br>";
            $crow++;
        }

数组中的所有变量都设置为0

$result = mysqli_query($GLOBALS['con'], $select);
$Rows = $result->num_rows;
$Rows2 = $Rows;
$Rows3 = $Rows;
$Rows4 = $Rows;
$Rows5 = $Rows;
$range1 = array();
$range2 = array();
$range3 = array();
$range4 = array();

while ($counter <= $Rows) {
    $range1[$crow] = $leftfrom[$add];
    $range2[$crow] = $leftto[$add];
    $counter++;
    $road++;
    $crow++;
}

while ($counter2 <= $Rows2) {
    $range3[$crow2] = $leftfrom[$add2];
    $range4[$crow2] = $leftto[$add2];
    $counter2++;
    $road3++;
    $crow2++;
}

$Combined1 = array();
$Combined1 = array();
while ($counter3 <= $Rows3) {
    $Combined1[$crow5] = range($range1[$crow3], $range2[$crow3]);
    $Combined2[$crow6] = range($range3[$crow3], $range4[$crow3]);
    $crow5++;
    $crow6++;
    $crow3++;
    $counter3++;
}

$check1 = 0;
while ($check1 <= $Rows4) {
$GLOBALS['check2'] = 0;
    $Rows6 = $GLOBALS['check2'] + 1;
    while ($GLOBALS['check2'] <= $Rows5) {

    $results = array_intersect($Combined1[$check1],$Combined2[$Rows6]);
    if ($results) {
        $start = reset($results);
        $end = end($results);
        echo "These are overlapping" . "<br>";
        echo "Start of overlap: " . $start . " Rows#: " . $check1 . " Bad Row: " . $GLOBALS['check2'];

        echo "<br>";
        echo "end of overlap: " . $end;
        echo "<br>" . $GLOBALS['check2'] ;
        $GLOBALS['check2']++;

    }else{
        echo "<br>" . $check1 . " No duplicates" . "<br>";
        $GLOBALS['check2']++;
        }
        }
    $check1++;

}
p8ekf7hl

p8ekf7hl1#

在php中不需要循环,完全可以通过将表本身连接起来来实现。

SELECT *
FROM yourTable AS t1
JOIN yourTable AS t2 
ON t1.id < t2.id
AND (t1.left_from <= t2.left_to AND t2.left_from <= t1.left_to)
``` `t1.id < t2.id` 防止它将行视为与自身重叠(并使用 `<` 而不是 `!=` 防止它两次显示同一对行)。替换 `id` 使用表的主键。
lh80um4z

lh80um4z2#

要检查,如果两个数字范围重叠,可以使用简单的测试 x1 < y2 AND y1 < x2 . 这可以组合在一个sql语句中。

SELECT
    t1.LEFT_FROM as LEFT_FROM_1,
    t1.LEFT_TO as LEFT_TO_1,
    t2.LEFT_FROM as LEFT_FROM_2,
    t2.LEFT_TO as LEFT_TO_2
FROM
    t t1, t t2
WHERE
    t1.LEFT_FROM < t2.LEFT_TO AND t2.LEFT_FROM < t1.LEFT_TO

此查询将返回所有重叠的范围。

相关问题