Разбиение кол-ва записей из mysql на несколько циклов обработки

Userbanderas

Новичок
Я разобрался что писать, но не могу понять куда нужно это вставить!
Пожалуйста доведите меня до конца этого кода!
PHP:
SELECT t1.id_hotel_number, t1.end_season AS
BEGIN , min( t2.begin_season ) AS
END , DATEDIFF( t1.end_season, min( t2.begin_season ) ) AS diff
FROM price_season t1, price_season t2
WHERE t1.id_hotel_number = t2.id_hotel_number
AND t2.begin_season > t1.end_season
GROUP BY t1.id_hotel_number, t1.end_season
ORDER BY 1 , 2
 

prolis

Новичок
Код:
SELECT t1.id_hotel_number, t1.end_season AS
BEGIN , min(ifnull( t2.begin_season,now()) ) AS
END , DATEDIFF( t1.end_season, min(ifnull( t2.begin_season,now()) ) ) AS diff
FROM price_season t1, price_season t2
WHERE t1.id_hotel_number = t2.id_hotel_number
AND t2.begin_season > t1.end_season
GROUP BY t1.id_hotel_number, t1.end_season
ORDER BY 1 , 2
 

Userbanderas

Новичок
Я уже пробовал делать такой запрос, но мне всё равно выдаются в результате только те сезоны, которых минимум два(т.е. например имеется: три поля с id_hotel_number = 103 и два поля с id_hotel_number = 104. А с id_hotel_number = 106 имеется только одно поле, так вот его тоже нужно выбрать, но diff установить к примеру в ноль или null).
 

Userbanderas

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

Userbanderas

Новичок
У меня есть уже готовое решение на PHP, но после того, как я создал, сделал вывод, что в mysql это будет выполняться быстрее и компактнее выглядит код.
А что скажете Вы?
 

Userbanderas

Новичок
Вот код на PHP:
PHP:
if(mysql_num_rows($resultDate) > 0) 
			{	// создаём многомерный массив, чтобы получить возможность сосчитать кол-во дней между полученными периодами
				while ($myrowDate = mysql_fetch_array($resultDate))
					{
						echo $myrowDate['id_hotel_number'].") ".$myrowDate['begSea'].' - '.$myrowDate['endSea'].'<br>';
						$startDate[$myrowDate['id_hotel_number']][] = $myrowDate['begSea'];
						$finalDate[$myrowDate['id_hotel_number']][] = $myrowDate['endSea'];		
						$id[$myrowDate['id_hotel_number']][] = $myrowDate['id_hotel_number'];
						$id_season[$myrowDate['id_hotel_number']][] = $myrowDate['id'];
						
					}
				// обрабатываем массив для подсчёта кол-ва дней между периодами
				foreach($id as $key => $idArr)
				{
				
					foreach($idArr as $keyId => $value)
					{	
						// Узнаём кол-во квот у каждого номера отеля.
						// Если кол-во квот == 1, тогда обработать квоту этого номера отеля с квотами допущенных номеров, кол-во дней
						// между которыми не больше одного.
						echo '------'.$value.'<br>';
						//echo count($idArr); // кол-во квот в одном номере
						if(count($idArr) == 1) 
						{
							$arrValueId[$key] = $key; // создаём массив с id номеров отелей, кот. допущены для дальнейшей проверки.
						}
					}
					echo $key.'<br>';
					array_pop($idArr); // удаляем последний id, чтобы не считало пустые значения
					array_pop($finalDate[$key]); // удаляем последнее значение из конечной даты
					array_shift($startDate[$key]); // удаляем первое значение из начальной даты
					// в этом цикле ведётся подсчёт между периодами дат
					foreach($idArr as $keyId => $value)
					{ 
						$finalDate[$key][$keyId].' - '.$startDate[$key][$keyId].', ';
						
						$dateInitial = $finalDate[$key][$keyId]; // входящее значение ф-ции подсчёта кол-ва дней
						$dateFinal = $startDate[$key][$keyId]; // входящее значение ф-ции подсчёта кол-ва дней
						echo amountDaysBetweenDate($dateInitial,$dateFinal).' день) '.$key.'<br><br>';
						// если кол-во дней между периодами дат не более 1, тогда показать номер
                                                // кол-во дней выполняем через ф-цию
						if(amountDaysBetweenDate($dateInitial,$dateFinal) <= 1)
						{ 							
							$flr .= "id = '$key' OR "; // позволяем извлечь из БД этот номер в отеле (id_hotel_number)
							$arrValueId[$key] = $key; // создаём массив с id номеров отелей, кот. допущены для дальнейшей проверки.
						}
						
					}

				}
				// получаем id ценового сезона в БД, чтобы извлечь даты и проверить входят ли они в выбранный диапазон дат бронирования
				foreach ($arrValueId as $keyArrValueId)
				{
					echo '- '.$keyArrValueId.'<br>';
					foreach($id_season[$keyArrValueId] as $keyIdSeason => $valueIdSeason)
					{
						echo $valueIdSeason.'<br>';
						$season .= "$valueIdSeason,";	// id ценового сезона в БД (формат 3,4,7,8,)
					}
				}
			}
		}
		
		echo	'id Ценового сезона '.$season = substr($season, 0, strlen($season)-1); // удаляем последнюю запятую из списка с id ценового сезона
		// Выбираем id_hotel_number из mysql для дальнейшей выборки свободных номеров отеля
		$result_id_hotel_number = mysql_query("
		SELECT `price_season`.id_hotel_number,
		min(`price_season`.begin_season) AS min, 
		max(`price_season`.end_season) AS max,
		hotel_number.category 
		FROM `price_season`,hotel_number WHERE `price_season`.id IN (".$season.") AND
		hotel_number.id = price_season.id_hotel_number
		GROUP BY id_hotel_number HAVING min <= '2012-04-04' AND max >= '2012-04-07'",$db);
	}
}

while($myrow_id_hotel_number = mysql_fetch_array($result_id_hotel_number))
{
	echo '<br>'.$myrow_id_hotel_number['id_hotel_number']. ' - ' .$myrow_id_hotel_number['category'];
}
 

prolis

Новичок
покажи результат приведенного sql с этой страницы на тестовых данных с предыдущей страницы.
 

Userbanderas

Новичок
Щас подумал, по сути нужно извлечь все ценовые сезоны, но там где одинаковых id_hotel_number несколько - между ними посчитать разницу, а у остальных к примеру diff установить в false.
 

prolis

Новичок
это я забыл что не left join
Код:
SELECT t1.id_hotel_number, t1.end_season AS
BEGIN , min(ifnull( t2.begin_season,now()) ) AS
END , DATEDIFF( t1.end_season, min(ifnull( t2.begin_season,now()) ) ) AS diff
FROM price_season t1
left join price_season t2 on 
( t1.id_hotel_number = t2.id_hotel_number
AND t2.begin_season > t1.end_season)
GROUP BY t1.id_hotel_number, t1.end_season
ORDER BY 1 , 2
 

Userbanderas

Новичок
Спасибо Вам огромное! Если бы не Вы, я бы до сих пор наверное пытался решить эту задачу. Вы мне очень помогли!!!
 
Сверху