Как получить диапазоны ID из базы?

Статус
В этой теме нельзя размещать новые ответы.

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
412
Реакции
48
Есть база данных MySQL, в ней таблица с полями ID (AUTO_INCREMENT), key, val.
Она имеет следующи вид
Код:
1            house    Oslo
2            house    Perth
...
483   inn        country
484   inn        Georgetown
485   inn        country view
...
123886   inn        cozy inn Brighto
123887   inn        cozy inn janesvill
123888   inn        cozy inn
123889   inn        cranbury inn nj
...
179314    travel    travel agent
179315    travel    what is the safest way to travel
179316    travel    when is the best time to travel to Italy
...
224317 resort Mexico
224318 resort Miami
224319 resort Wyndham

Ключи в таблицу добавлялись пачками, т.е. добавили 1000 кееев с ключем inn, затем добавили 5000 кеев с ключём resort и т.д.

Нужно написать функцию на PHP, которая принимает key, например inn и которая бы прошлась по таблице и выдала для кея inn массив диапазонов ID, т.е. для кея inn она должна выдать
Код:
[
    0 => [ 'min' => 483, 'max' => 485 ],
    1 => [ 'min' => 123886, 'max' => 123889 ]
    ]

Подскажите, как лучше всего написать такую функцию?
Установлена MariaDB 10.5.8
 
Последнее редактирование:

AleksKu

Писатель
Регистрация
21 Май 2015
Сообщения
5
Реакции
4
Приветствую, примерно так:
PHP:
$key = ""; //Подставляем ключ который ищем
$connect = mysqli_connect("localhost", "user", "password", "dbname")or die ('Нет связи с Базой Данных'); //вместо user, password,  dbname подставляем свои значения
$query = mysqli_query($connect, "SELECT ID FROM tablename WHERE  key  =".$key." ORDER BY ID ASC"); //tablename меняем на название своей таблицы. Значения уже отсортированы по возрастанию.
$row = mysqli_fetch_array($query);
$result  = array();
$count = count($row);
$key_c = null;
$lid = 0;
for($i=0; $i<=$count; $i++){
    if($key_c == null){ //Начало цикла, 1-е значение по умолчанию будет стартовым минимальным в массиве $result
        $result[$lid]["min"] = $row[$i] ;
        $key_c = $row[$i] ;
    }else{
        if($key_c+1 == $row[$i] ) //проверка "неразрывности" диапазона
        {
            $key_c = $row[$i] ;
        }else{
            if(isset($result[$lid]["max"])){ //проверка наличия конца предыдущего диапазона
                $result[$lid]["min"] = $key_c ;
                $key_c = $row[$i] ;             
            }else{
                $result[$lid]["max"] = $key_c ; 
                $key_c = $row[$i] ;
                $lid++; //Стартуем следующий индекс массива $result
            }
        }
 
    }
    if($i == $count and isset($result[$lid]["min"])){ //добавляем последнее найденное значение
    $result[$lid]["max"] = $row[$i] ;
    }else{
    $result[$lid]["min"] = $row[$i] ;
    $result[$lid]["max"] = $row[$i] ;
    }
}

Обращаю внимание, что последнее значение может быть единственное в диапазоне. К примеру выборка ID по значению inn дало такие диапазоны:
Код:
[
    0 => [ 'min' => 483, 'max' => 485 ],
    1 => [ 'min' => 123886, 'max' => 123889 ],
    2 => [ 'min' => 223886, 'max' => 223886]
    ]
В таком случае min и max значения будут одинаковыми. Если требуется другое поведение - можно поправить код (почти в самом низу).

p.s.
Ты хоть напиши: помогло - нет?) Код, к сожалению писал на коленке :)
 
Последнее редактирование:

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
412
Реакции
48
Да, спасибо, помогло :)
На другом форуме писали, что такое нужно делать средствами MySQL. Но я не вижу ничего плохого, чтобы реализовать это средствами PHP.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху