Mysql Выборка дней и часов работы заведения в MySQL

Сенсей

Новичок
Нужна помощь ибо измучался уже.

В каталоге заведений (фирм) есть опция указать часы работы.

09-11-2012 21-39-08.jpg

В базе сохраняю в таком формате:

09-11-2012 21-32-13.jpg

1. Если у заведения есть перерыв на обед - в базу добавляются 2 записи с одним и тем же полем day (в примере это записи с 10 до 14 и вторая запись с 15 до 18:30)
2. Если заведение работает без перерывов (в примере с 10 до 12 в day=5)
3. Если заведение закрыто - не добавляем запись с этим днем в таблицу (в примере не добавлена запись с day=6)

По хорошему вывод дат должен быть такой:

Часы работы в дни:
0,1,2,3,4 - c 10:00 до 14:00 и с 15:00 до 18:30
5 - c 10:00 до 12:00
6 - закрыто

0 - воскресенье .... 6 - суббота.

Пытаюсь использовать GROUP_CONCAT что бы выдавал список поля day (например 0,1,2,3,4) и 2 раза time_from и time_to

Ни как не получается.

Самое близкое к чему подобрался это вот:
PHP:
SELECT GROUP_CONCAT( CAST( a.day AS CHAR ) ) AS days, DATE_FORMAT( a.time_from,  '%H:%i' ) AS f_time_from, DATE_FORMAT( a.time_to,  '%H:%i' ) AS f_time_to, DATE_FORMAT( b.time_from,  '%H:%i' ) AS f_time_from_s, DATE_FORMAT( b.time_to,  '%H:%i' ) AS f_time_to_s
FROM business_affiliate_hours AS a
LEFT JOIN business_affiliate_hours AS b ON a.day = b.day
WHERE a.affiliate_id =57
GROUP BY a.time_from, a.time_to
Но в GROUP_CONCAT появляются дубликаты.
И вместо возвращения 2 записей (для дней с 0 до 4 и для дня 5 в соответствии с примером) возвращает 3 записи где в 3 ей вообще бред.

Прошу помогите :)
 

Сенсей

Новичок
Дошел вот до чего:

PHP:
SELECT GROUP_CONCAT( DISTINCT CAST( a.day AS CHAR ) 
ORDER BY a.day ) AS days, DATE_FORMAT( a.time_from,  '%H:%i' ) AS f_time_from, DATE_FORMAT( a.time_to,  '%H:%i' ) AS f_time_to, DATE_FORMAT( b.time_from, '%H:%i' ) AS f_time_from_s, DATE_FORMAT( b.time_to,  '%H:%i' ) AS f_time_to_s
FROM business_affiliate_hours AS a
LEFT JOIN business_affiliate_hours AS b ON a.day = b.day
WHERE a.affiliate_id =57
GROUP BY a.time_from, a.time_to
ORDER BY a.id ASC
Получаем вот что:

09-11-2012 22-29-26.jpg

А то что я хочу должно выглядеть так:

09-11-2012 22-33-47.jpg
 

Сенсей

Новичок
Зачем так дразнить.. я пол дня потратил и без результатов...
Можно на словах хотя бы алгоритм?
 

Сенсей

Новичок
PHP:
SELECT dh.affiliate_id, GROUP_CONCAT(CAST(dh.day AS CHAR) ORDER BY dh.day ASC), dh.f_time_from, dh.f_time_to, dh.f_time_from_s, dh.f_time_to_s FROM
(
SELECT id, affiliate_id,
day, DATE_FORMAT(MIN(time_from), '%H:%i') AS f_time_from,
DATE_FORMAT(MIN(time_to), '%H:%i') AS f_time_to,
IF(MIN(time_from) != MAX(time_from), DATE_FORMAT(MAX(time_from), '%H:%i'), '') AS f_time_from_s
,
IF(MIN(time_from) != MAX(time_from), DATE_FORMAT(MAX(time_to), '%H:%i'), '') AS f_time_to_s 
FROM business_affiliate_hours 
GROUP BY affiliate_id,
DAY
ORDER BY DAY) AS dh GROUP BY dh.f_time_from, dh.f_time_to, dh.f_time_from_s, dh.f_time_to_s ORDER BY dh.id ASC
Вроде оно =))) Tnx!!! Теперь можно идти спать...
 

WMix

герр M:)ller
Партнер клуба
PHP:
CREATE TABLE IF NOT EXISTS `business_affiliate_hours` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `affiliate_id` int(10) unsigned NOT NULL,
  `time_from` time NOT NULL,
  `time_to` time NOT NULL,
  `day` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `affiliate_id` (`affiliate_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

INSERT INTO `business_affiliate_hours` 
(`id`, `affiliate_id`, `time_from`, `time_to`, `day`) 
VALUES
(1, 2, '10:00:00', '14:00:00', 0),
(2, 2, '15:00:00', '18:30:00', 0),
(3, 2, '10:00:00', '14:00:00', 1),
(4, 2, '15:00:00', '18:30:00', 1),
(5, 2, '10:00:00', '14:00:00', 2),
(6, 2, '15:00:00', '18:30:00', 2),
(7, 2, '10:00:00', '14:00:00', 3),
(8, 2, '15:00:00', '18:30:00', 3),
(9, 2, '10:00:00', '14:00:00', 4),
(10, 2, '15:00:00', '18:30:00', 4),
(11, 2, '10:00:00', '12:00:00', 5);

SELECT 
	affiliate_id,
	GROUP_CONCAT( CAST( dh.day AS CHAR ) ),
	dh.f_time_from,
	dh.f_time_to,
	dh.f_time_from_s,
	dh.f_time_to_s
FROM (
	SELECT
		affiliate_id,
		day,
		DATE_FORMAT( MIN( time_from ),  '%H:%i' ) AS f_time_from, 
		DATE_FORMAT( MIN( time_to ),  '%H:%i' ) AS f_time_to, 
		IF( MIN( time_from ) != MAX( time_from ) , DATE_FORMAT( MAX( time_from ), '%H:%i' ), '') AS f_time_from_s, 
		IF( MIN( time_from ) != MAX( time_from ) , DATE_FORMAT( MAX( time_to ),  '%H:%i' ), '') AS f_time_to_s
	FROM business_affiliate_hours
	GROUP BY affiliate_id, day
	ORDER BY day
) as dh
GROUP BY affiliate_id,CONCAT(f_time_from,f_time_to,f_time_from_s,f_time_to_s)
я так написал, но не дразнил тебя, а учил оставлять create table и данные...

мне пришлось твою табличку самому собирать!
 
Сверху