【问题标题】:Select and show business open hours from MySQL从 MySQL 中选择并显示营业时间
【发布时间】:2012-11-09 22:21:55
【问题描述】:

我不需要检查营业时间是营业还是关闭,但我需要按天显示营业时间。

有一些选择:

1 - 一天营业一次(示例 - 从 10:00 到 18:30)- 一个 表中的行 2 - 一天营业两次(samlpe - 从 10:00 到 14:00 和 15:00 到 18:30) - 表格中的两行 3 - 业务可能 被关闭(不插入行)

这是我的 MySql 小时存储表。在此示例中,(affiliate_id) 在第 0 天到第 4 天开放两次,在第 5 天开放一次,在第 6 天关闭(这一天没有记录)

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

我需要在网站上显示的内容(根据此数据库示例:

0,1,2,3,4 - 10:00-14:00 和 15:00-18:30 开放 5 - 开放时间 10:00-12:00 6 - 关闭

我如何获得如下结果:

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

?

我尝试在 a.day=b.day 上使用 GROUPֹ_CONCAT 和 LEFT JOIN 查询同一张表,但没有成功:(

我的查询有示例(这是错误的)

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);

每天的营业时间可能不同,所以我想按相同的营业时间分组,并获取所有独特营业时间顺序的天数列表。

需要你的帮助!

对不起,图片链接,我不能上传图片到这里。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    首先建立一个每天合并时间的具体化表,然后对其进行分组:

    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 上查看。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2019-06-02
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多