Группировать записи по дате и времени из отметок времени - PullRequest
1 голос
/ 30 сентября 2011

Я строю систему бронирования и решил использовать временные метки для хранения бронирований в моей базе данных mysql.Пользователь может заказать 2 или 3 слота последовательно, например:

9:00 - 9:30
9:30 - 10:00
10:00 - 10:30

или они могут просто забронировать отдельные слоты.

Я хочу показать заказы, сделанные пользователем, но сгруппировать ихк временным рамкам, так, например, во время, показанное выше, должно отображаться 9:00 - 10:30 вместо перечисления 3 элементов.

Каждое бронирование сохраняется с bookingFrom и bookingUntil в качестве метки времени.Мне удалось заставить его работать на 2 бронирования (например, 9: 00-9: 30 и 9: 30-10: 00, чтобы показать только 9: 00-10: 00), но если есть средняя запись, яборется с тем, как заставить это работать.

Есть идеи?Я использую PHP / mySQL

ТАБЛИЦА СХЕМ

bookingID, userID, bookingFrom (INT - метка времени unix), bookingUntil (INT - метка времени unix)

    CREATE TABLE IF NOT EXISTS `dma_bookings` (
  `bookingID` int(11) NOT NULL AUTO_INCREMENT,
  `userID` int(11) NOT NULL,
  `bookingFrom` int(11) NOT NULL,
  `bookingUntil` int(11) NOT NULL,
  `roomID` int(11) NOT NULL,
  PRIMARY KEY (`bookingID`),
  KEY `userID` (`userID`,`bookingFrom`,`bookingUntil`),
  KEY `roomID` (`roomID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=98 ;

--
-- Dumping data for table `dma_bookings`
--

INSERT INTO `dma_bookings` (`bookingID`, `userID`, `bookingFrom`, `bookingUntil`, `roomID`) VALUES
(95, 1, 1317362400, 1317364199, 1),
(96, 1, 1317364200, 1317365999, 1),
(97, 1, 1317366000, 1317367799, 1);

Кодпока (извинения очень грязные!):

$bookingArray = $data['bookingInfo'];
        $bookingCleanArray = array();
        $reversedArray = array_reverse($data['bookingInfo']);
        $currentItemIndex=0;
        $nextItemIndex=1;

        foreach($reversedArray as $booking){
            echo "<hr>BookingID: ".$booking['bookingID']."<br/><br/>";

            $bookingFromMinusOne=$booking['bookingFrom']-1;

            if($bookingFromMinusOne==$data['bookingInfo'][$nextItemIndex]['bookingUntil']){

                //The current booking is part of a multiple booking range
                $bookingArray[$nextItemIndex]['bookingUntil']=$booking['bookingUntil'];
                unset($bookingArray[$currentItemIndex]);
            }else{
                echo "Single booking<br/>";
            }

            $currentItemIndex++;
            $nextItemIndex++;

        }

Ответы [ 2 ]

0 голосов
/ 02 октября 2011

Я думаю, что мой подход состоит в том, чтобы выбрать все заказы для данного пользователя, но упорядочить результаты по времени начала.Я чувствую, что ваш текущий цикл имеет правильное начало, вам просто нужно еще несколько условий, чтобы убедиться, что слоты работают.

Я бы начал с первого слота и продолжал регулировать время окончания, пока не достигну времени начала, которое больше текущего времени окончания.На этом этапе вы заканчиваете работу с текущим слотом (скажем, нажмите его на другой массив) и устанавливаете текущий слот на новый.

Вот пример, хотя у меня нет времени для тестированияя думаю, что это должно работать:

$slots = array(
    array('bookingID' => 95, 'userID' => 1, 'bookingFrom' => 1317362400, 'bookingUntil' => 1317364199, 'roomID' => 1), 
    array('bookingID' => 96, 'userID' => 1, 'bookingFrom' => 1317364200, 'bookingUntil' => 1317365999, 'roomID' => 1), 
    array('bookingID' => 97, 'userID' => 1, 'bookingFrom' => 1317366000, 'bookingUntil' => 1317367799, 'roomID' => 1)
);

$condensed_slots = array();
$currentSlot = null;
foreach($slots as $slot){
    if($currentSlot == null) $currentSlot = $slot;
    else {
        if($slot['bookingFrom'] <= $currentSlot['bookingUntil']){
            $currentSlot['bookingUntil'] = $slot['bookingFrom'];
        }
        else {
            $condensed_slots[] = $currentSlot;
            $currentSlot = $slot;
        }
    }
}

Таким образом, после этого $condensed_slots должен содержать сокращенный набор (если возможно) слотов, хотя bookingID может не обязательно отражать оригинальные from и untilвременные метки (очевидно).

0 голосов
/ 30 сентября 2011

Предполагая, что у вас есть отдельные поля для каждой загрузки их в массив, затем используйте первую строку и считайте, чтобы найти последнюю строку.

Но да, как сказала Рахуларяншарма, нужно немного больше деталей.

Хорошо ... хм Не могли бы вы просто взять:

SELECT dma_bookings (bookingID, userID, bookingFrom, bookingUntil, roomID) WHERE userID = 1)

Что должно дать нам:

bookingID, userID, bookingFrom, bookingUtil до ID комнаты

 $bookingArray = array( 95, 1, 1317362400, 1317364199, 1 ),
 array( 96, 1, 1317364200, 1317365999, 1 ),
 array( 97, 1, 1317366000, 1317367799, 1 ),

так что если мы ...

echo  $bookingArray[][2]; we get '1317362400'
$c = count($bookingArray);
echo $bookingArray[$c][3]; we get '1317367799'

Или я совершенно не понял, что вы пытаетесь сделать?

...