2

営業しているか閉店しているかを確認する必要はありませんが、営業時間を日ごとに表示する必要があります。

いくつかのオプションがあります:

1-営業時間は1日1回(サンプル-10:00〜18:30)-表2の1行-営業時間は1日2回(samlpe-1:00〜14:00および15:00〜18:) 30)-表3の2行-ビジネスは閉鎖される可能性があります(行は挿入されません)

ここに私のMySqlの保存時間表があります。このサンプルビジネス(affiliate_id)では、0から4までの2日間、5日目に1回、6日目に閉鎖されます(この日のレコードはありません)

http://postimage.org/image/yplj4rumj/

私がウェブサイトに表示する必要があるもの(このデータベースの例によると:

0,1,2,3,4-営業時間10:00-14:00および15:00-18:305-営業時間10:00-12:006-閉店

次のような結果を得る方法:

http://postimage.org/image/toe53en63/

GROUPֹ_CONCATとLEFTJOINを使用してa.day=b.dayに同じテーブルでクエリを実行しようとしましたが、運がありませんでした:(

私のクエリのサンプルがあります(それは間違っています)

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, b.time_from, b.time_to

 ORDER BY a.id ASC

これは私のテーブルです:

CREATE TABLE IF NOT EXISTS `business_affiliate_hours` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `affiliate_id` int(10) unsigned NOT NULL DEFAULT '0',
  `time_from` time NOT NULL,
  `time_to` time NOT NULL,
  `day` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;


INSERT INTO `business_affiliate_hours` (`id`, `affiliate_id`, `time_from`, `time_to`, `day`) VALUES
(53, 57, '10:00:00', '12:00:00', 5),
(52, 57, '15:00:00', '18:30:00', 4),
(51, 57, '10:00:00', '14:00:00', 4),
(50, 57, '15:00:00', '18:30:00', 3),
(49, 57, '10:00:00', '14:00:00', 3),
(48, 57, '15:00:00', '18:30:00', 2),
(47, 57, '10:00:00', '14:00:00', 2),
(46, 57, '15:00:00', '18:30:00', 1),
(45, 57, '10:00:00', '14:00:00', 1),
(44, 57, '15:00:00', '18:30:00', 0),
(43, 57, '10:00:00', '14:00:00', 0);

営業時間は毎日異なる場合があるので、同じ営業時間でグループ化し、営業時間のすべての一意の順序の日のリストを取得したいと思います。

君の力が必要!

画像へのリンクをお詫び申し上げます。ここに画像をアップロードすることはできません。

4

1 に答える 1

2

まず、毎日の合計時間の具体化されたテーブルを作成し、次にそれをグループ化します。

SELECT   GROUP_CONCAT(day ORDER BY day) AS days,
         DATE_FORMAT(f1, '%H:%i') AS f_time_from,
         DATE_FORMAT(t1, '%H:%i') AS f_time_to,
         DATE_FORMAT(f2, '%H:%i') AS f_time_from_s,
         DATE_FORMAT(t2, '%H:%i') AS f_time_to_s
FROM (
  SELECT   day,
           MIN(time_from) AS f1,
           MIN(time_to  ) AS t1,
           IF(COUNT(*) > 1, MAX(time_from), NULL) AS f2,
           IF(COUNT(*) > 1, MAX(time_to  ), NULL) AS t2
  FROM     business_affiliate_hours
  WHERE    affiliate_id = 57
  GROUP BY day
) t
GROUP BY f1, t1, f2, t2
ORDER BY days

sqlfiddleでそれを参照してください。

于 2012-11-09T22:53:01.063 に答える