Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mysql объединение 2-х таблиц, сопоставление присутствия ID из I вo II 
V
    Опции темы
Date
Дата 13.9.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Добрый день! 

Есть 2 таблицы, TimeRange и TimeControl 

TimeRange – это набор временных диапазонов. Структура такая

ID int(11)
TimeRange text


TimeControl — в этой таблице храниться дата и время. А именно занятое время. Структура такая 

ID int(11)
DATE date
TimeID int(11)


Вопрос такой:

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

Например:

2011-09-16 - 1
2011-09-16 - NULL
2011-09-16 - 3
2011-09-16 - NULL
2011-09-16 - NULL
2011-09-16 - 6
2011-09-16 - 7
2011-09-16 - NULL
2011-09-16 - 9
2011-09-16 - NULL
2011-09-17 - 1
2011-09-17 - NULL


и т.д.

Сломал уже всю голову... 

заранее благодарю.

--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
Akina
Дата 13.9.2011, 18:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Date @  13.9.2011,  17:27 Найти цитируемый пост)
Например

Охренительный просто пример!

Несколько записей из первой таблицы (все поля!!!).
Несколько записей из второй таблицы.
Желаемый результат НА ПРИВЕДЁННЫХ ДАННЫХ.
Объяснение, почему он именно такой.

При оформлении использовать моноширинный шрифт (или соотв. теги).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Date
Дата 15.9.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Цитата(Akina @  13.9.2011,  21:11 Найти цитируемый пост)
Охренительный просто пример!


Чем Вам не нравиться пример? я указал что именно необходимо получить. 

Цитата(Akina @  13.9.2011,  21:11 Найти цитируемый пост)
Несколько записей из первой таблицы (все поля!!!).
Несколько записей из второй таблицы.


все записи результат слияния двух таблиц, Дата берется из таблицы TimeControl, следующее поле заполняется, по мере скажем так "занятости", то есть если время в этом дне занято то оно получает его ID, если нет то ставим NULL
--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
AndreyIQ
Дата 15.9.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Цитата(Date @ 13.9.2011,  16:27)
Сломал уже всю голову... 

Тоже сломал всю голову.
Цитата(Date @ 15.9.2011,  10:03)
Цитата(Akina @  13.9.2011,  21:11 Найти цитируемый пост)
Охренительный просто пример!


Чем Вам не нравиться пример? я указал что именно необходимо получить. 

Цитата(Akina @  13.9.2011,  21:11 Найти цитируемый пост)
Несколько записей из первой таблицы (все поля!!!).
Несколько записей из второй таблицы.


все записи результат слияния двух таблиц, Дата берется из таблицы TimeControl, следующее поле заполняется, по мере скажем так "занятости", то есть если время в этом дне занято то оно получает его ID, если нет то ставим NULL

Вам уже было написано как надо оформить, если Вы не хотите нам помочь разобраться, то чего Вы от нас хотите? smile 
PM MAIL   Вверх
Zloxa
Дата 15.9.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Date, неужели вы не понимаете, что ваша задача не понятна не только вам. Повторю то, что уже сказал Акина.
Если желаете помощи, приведите исходные данные. Не менее трех строк для каждой таблицы. И приведите результат, ожидаемый на  этих исходных данных. 



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 15.9.2011, 10:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Date, проблема - у Вас. Поверьте на слово, всем, кроме Вас, глубоко плевать, решите Вы её или нет.

Ваш отказ от предоставления запрошенной информации трактуется однозначно - Вам тоже плевать.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Date
Дата 15.9.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



постараюсь попонятнее объяснить:

есть таблица TimeRange - эта таблица содержит диапазоны доступного времени (то есть времени которое можно выбрать), на пример с 8.00 до 9.00, с 9.00 до 10.00 и т.д. структура таблицы описана выше. 

Листинг:
Код

CREATE TABLE IF NOT EXISTS `TimeRange` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `TimeRange` text NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `ID` (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COMMENT='Таблица диапазона веремени' AUTO_INCREMENT=10 ;

--
-- Dumping data for table `TimeRange`
--

INSERT INTO `TimeRange` (`ID`, `TimeRange`) VALUES
(1, 'c 8.00 до 9.00'),
(2, 'c 9.00 до 10.00'),
(3, 'c 10.00 до 11.00'),
(4, 'c 11.00 до 12.00'),
(5, 'c 12.00 до 13.00'),
(6, 'c 14.00 до 15.00'),
(7, 'c 16.00 до 17.00'),
(8, 'c 18.00 до 19.00');


TimeControl - в этой таблице занятое время на конкретную дату.
то есть 2011-09-11, занятое время 1, 2 что соответствует записям "с 8.00 до 9.00" и "9.00 до 10.00" в таблице TimeRange.

Листинг:

Код

CREATE TABLE IF NOT EXISTS `TimeControl` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'уникальный номер записи',
  `DATE` date NOT NULL COMMENT 'дата',
  `TimeID` int(11) NOT NULL COMMENT 'Идентификатор времяни',
  PRIMARY KEY (`ID`),
  KEY `ID` (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COMMENT='управления времинем' AUTO_INCREMENT=71 ;


INSERT INTO `TimeControl` (`ID`, `DATE`, `TimeID`) VALUES
(1, '2011-09-15', 1),
(54, '2011-09-15', 5),
(3, '2011-09-15', 3),
(42, '2011-09-16', 5),
(5, '2011-09-15', 5),
(6, '2011-09-15', 6),
(7, '2011-09-15', 7),
(41, '2011-09-16', 4),
(49, '2011-09-13', 6),
(48, '2011-09-13', 5),
(11, '2011-09-16', 4),
(12, '2011-09-16', 5),
(13, '2011-09-23', 5),
(40, '2011-09-16', 2),
(31, '2011-09-15', 0),
(30, '2011-09-15', 0),
(33, '2011-09-13', 5),
(34, '2011-09-15', 1),
(53, '2011-09-15', 6),
(36, '2011-09-15', 3),
(37, '2011-09-15', 5),
(38, '2011-09-15', 6),
(39, '2011-09-15', 7),
(45, '2011-09-17', 8),
(44, '2011-09-17', 8),
(47, '2011-09-14', 3),
(50, '2011-09-13', 7),
(51, '2011-09-15', 3),
(52, '2011-09-15', 1),
(55, '2011-09-15', 7),
(56, '2011-09-16', 2),
(57, '2011-09-16', 7),
(58, '2011-09-16', 5),
(59, '2011-09-16', 4),
(60, '2011-09-17', 6),
(61, '2011-09-17', 8),
(62, '2011-09-13', 5),
(63, '2011-09-13', 6),
(64, '2011-09-13', 3),
(65, '2011-09-13', 7),
(66, '2011-09-15', 5),
(67, '2011-09-15', 1),
(68, '2011-09-15', 6),
(69, '2011-09-15', 3),
(70, '2011-09-15', 7);


например: звонит клиент и говорит в какой день и на какое время хочет записаться, Администратор отмечает что в этот день и в это время придет этот клиент. далее надо вывести отчет что занято в дне
--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
Zloxa
Дата 15.9.2011, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Date @  15.9.2011,  12:03 Найти цитируемый пост)
 отчет что занято в дне 

Код

select r.TimeRange, c.id
from TimeRange r
left join TimeControl c on c.date = :date and r.id = c.TimeID


Код

select r.TimeRange, c.id
from (select :date date from dual) dt
cross join TimeRange r
left join TimeControl c on dt.date = c.date and r.id = c.TimeID

для этого примера хорош б был индекс на  пару (date,TimeID).


Если нужно не поодноу дню.. лучше заветси табличку с каленадрем, подставлять ее во второй запрос  вместо подзапроса dt.
Если табличку создать нельзя, можно выкрутиться вместо подзапроса dt сделать подзапрос (select distinct date from TimeRange). Но надо понимать что время выполнение запроса будет расти линейно к количеству записей.

Это сообщение отредактировал(а) Zloxa - 15.9.2011, 12:27


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Date
Дата 15.9.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.3.2006
Где: Алматы

Репутация: нет
Всего: 3



Zloxa, то что надо!

Добавлено через 19 секунд
Спасибо большое!

Добавлено через 14 минут и 25 секунд
Zloxa, немного переделал запрос, теперь вообще то что надо... 

Код

SELECT r.TimeRange, c.id, dt.DATE
FROM (
    SELECT DATE DATE
    FROM TimeControl
    GROUP BY DATE
)dt
CROSS JOIN TimeRange r
LEFT JOIN TimeControl c ON dt.date = c.date
AND r.id = c.TimeID
ORDER BY  `dt`.`DATE` ASC 

 
Спасибо еще раз. 
--------------------
Люди не будьте свиньями, Бросайте мусор в урны.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0853 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.