Ка обединенить две таблицы поусловию одной из них

Resurs

Новичок
Ка обединенить две таблицы поусловию одной из них

Вопрос такой
есть таблица t1
id | hour | minute | meeting | data
1 10 00 Петров 2005-08-01
2 10 20 Пупкин 2005-08-01
3 10 40 Пупкин 2005-08-01
4 21 40 Пупкина 2005-08-01
5 11 00 Иавнов 2005-08-24
6 11 20 Иванов 2005-08-24
7 12 20 Сидоров 2005-08-24

таблица t2
hour | minute
09 00
09 20
09 40
10 00
10 20
10 40
11 00
... ...
21 00
21 20
21 40

Как бы выбрать так, что бы в результате для конкретной даты (например 2005-08-21)получилось
hour | minute | meeting | data
09 00
09 20
09 40
10 00 Петров 2005-08-21
10 20 Пупкин 2005-08-21
10 40 Пупкин 2005-08-21
11 00
... ...
21 00
21 20
21 40 Пупкина 2005-08-21

Видимо надо использовать LEFT JOIN
Что-то типа
SELECT t2.hour, t2.minute, t1.meeting, t1.data FROM t2 LEFT JOIN t1 ON (t1.hour=t2.hour) или USING(hour)
но если добавить усолвие WHERE t1.data=2005-08-21, из результата запроса исключаются пустые строки из t2
и получится что-то вроде

Помогите советом.
PHP 4.4.0 MySQL 4.0.25
 

alpine

Новичок
Resurs
Ну во первых почему бы не объединить hour и minute в поле с типом данных TIME (00:00:00) ?
Во вторых
[sql]
SELECT t2.hour, t2.minute, t1.meeting, t1.data FROM t2 LEFT JOIN t1 ON t1.hour=t2.hour AND t1.data='2005-08-21'
[/sql]

-~{}~ 24.08.05 20:58:

В-третьих, какой смысл у таблицы t2 ?
 

Resurs

Новичок
Смысл в следующем.
Все это делается для т.н. органайзера (что-то типа календаря в Outlook).
Т.е человек вписывает в t1 назаначенные встречи. Время строго фиксированно с 9 до 21 с промежутком в 20 мин (9.00 9.20 9.40 10.00 10.20 и т.д. до 21.40) каждый день.
По этому я и сделал отдельно часы и минуты.

Таблица t2 это собственно список всех часов и минут.

В результате должна нарисоваться таблица
час | минуты|встреча
если ничего не назначено далее по порядку
час | минуты | пустая строка, что бы было ясно - есть свободное время или нет

Сначала я предпологал сделать след.образом:
выбрать все втречи на сегодня из t1.
И в цикле ($i=9;$i<22; $i++) нарисовать нужное мне, попутно вставляяе строки из t1 с назначенными встречами где необходимо.
Но как связать это воедино непонятно.
Поэтому я сделал таблицу t2, что бы одним запросом, объединив t1 и t2 получить нужный результат
 

alpine

Новичок
Resurs
Хорошо, а если завтра у тебя будет не через 20 мин а через 10мин ты будешь лезть и вручную перебивать таблицу?!

IMHO твой топик нужно перенести в раздел "Всё о программировании на РНР" и разбирать там, так как у тебя проблема не с mysql, а с логикой.
 

Resurs

Новичок
20-минутные отрезки - жестко заданное условие, это не мной придуманно
 

alexhemp

Новичок
Resurs

Хранить в базе нужно точное время начала и время окончания (длительность вычислять при выводе).

Выводить ячейки с 20 минутным интервалом - простым циклом на PHP просто считав список дел на сегодня. Совершенно не нужно разбивать эти дела в запросе.

Сделать это элементарно. Значительно проще чем переделывать в будущем когда заказчик захочет настраиваемый интервал.
 

Resurs

Новичок
Со временем ясно, переделал...
Если я правильно понял alexhemp-а порядок действий следующий:
Сетку времени я рисую с помщью PHP в цикле с шагом в 20 мин.
Сами встречи беру из t1.
А дальше-то как? Как все это соединить?

Делать для каждой двадцатиминутки запрос в базу - глупо.
Считать результаты запроса в массив и дальше с циклами извращаться?
Как вывести весь временной интервал (с 9.00 до 21.40) со встречами(там где они есть), что бы получился наглядный список задач для человека (типа с 9 до 10.20 пусто, с 10.20 до 10.40 встреча с Ивановым, далее опять пусто до 12.00 и т.д)?
 

alpine

Новичок
Resurs
Попробуй думать логически у тебя есть два массива - первый с сгенерированной сеткой второй со встречами из базы. Теперь тебе нужно их смержить.
Сгенерить сетку можно примерно так
PHP:
<?php
// Время преобразуем в минуты.
$start		= 9 * 60;
$end		= 21.67 * 60;
$interval	= 20;

$mesh = array();
$current = $start;
while ($end >= $current) {
	$mesh[ minToHours($current) ] = null;
	$current += $interval; 
}


print_r($mesh);

///////////////////////////////////////

function minToHours($min)
{
	$sDate = number_format($min/60, 2, '.', '');
	$aDate = explode('.', $sDate);

	return sprintf('%02d:%02d', $aDate[0], round($aDate[1]*60/100));
	
}
?>
-~{}~ 26.08.05 01:13:

второй массив приводишь к виду
PHP:
array(
 '09:20' => 'some text',
 '12:00' => 'some text',
 '21:40' => 'some text',
);
и смерживаешь функцией [m]array_merge[/m] с массивом $mesh.
 

alexhemp

Новичок
Resurs
Что значит "извращаться"

Нормальная логика тебе поможет.

Рассказываю

1. Выбираешь все записи за текущий день.

2. Цикл по интервалам - надеюсь напишешь сам. (хинт - начинаешь от 0 минут и прибавляешь интервал в цикле, далее для вывода - считаешь целое количество часов и остаток минут в этом часе).

3. На каждой итерации данного цикла - ищешь в массиве элементы - время начала которых укладывается в диапазон
"текущее начала интервала" : "текущее начала интервала + длина интервала"

Выводишь ;-)
 
Сверху