2010-06-23 10 views
6

का उपयोग कर मैं एक मेज रेस्तरां के खुलने का समय सूचीबद्ध करता है मानव पठनीय प्रारूप में एक डेटाबेस तालिका से खुलने। कॉलम आईडी, eateries_id, DAY_OF_WEEK, start_time, और end_time हैं। प्रत्येक भोजनालय को तालिका में कई बार दर्शाया जाता है क्योंकि प्रत्येक दिन एक अलग प्रविष्टि होती है। अधिक जानकारी के लिए यह पिछला प्रश्न देखें: determine if a restaurant is open now (like yelp does) using database, php, jsमुद्रण रेस्टोरेंट php

मुझे आश्चर्य है कि इस तालिका से डेटा कैसे लेना है और इसे मानव पठनीय प्रारूप में प्रिंट करना है। उदाहरण के लिए, बजाय कह रही है की "एम 1-3, टी 1-3, डब्ल्यू 1-3, गु 1-3, एफ 1-8" मैं कहना चाहते हैं "एम गु 1-3, एफ 1-8" । इसी तरह, मैं "एम 1-3, एम 5-8" के बजाय "एम 1-3, 5-8" चाहता हूं। बयान के बावजूद मैं कितने क्रूर बल विधि के बिना ऐसा कर सकता हूं?

धन्यवाद।

+1

क्या "एम 1-3" यह डीबी में कैसे संग्रहीत है? या यह एक टाइमस्टैम्प है? –

+0

यह एक दिलचस्प समस्या है ... मैं इसके बारे में सोचने की कोशिश करूंगा। यह मुझे सर्किट सरलीकरण का थोड़ा सा याद दिलाता है, जिसमें कर्णघ मैप्स शामिल हैं :) मुझे लगता है कि आप उच्च स्तरीय दृष्टिकोण की परवाह करते हैं और उन उत्तरों को संभाल सकते हैं जो आपकी सटीक तालिका से मेल नहीं खाते हैं। वैसे, केवल पूरे घंटों की अनुमति है? सबसे पहला संभव घंटा और नवीनतम संभव घंटा कब होता है? –

+0

मैं एक हैश टेबल लेकर शुरू करूंगा जो दिन में घंटों के लिए मानचित्र करता है, जैसे '{' एम ': सेट (1,2,3,5,6,7,8),' टी ': सेट (1, 2,3)} 'या' {'एम': 'yyynyyyy'} '(यह दर्शाता है कि प्रत्येक घंटा (यहां 1 से शुरू होता है) उपलब्ध है। यह निर्धारित करने का पहला कदम है कि कौन से 2 दिनों में एक ही शेड्यूल है, साथ ही साथ घंटों के संघ को कंप्यूटिंग और सरलीकृत करना भी आसान है। आपके उदाहरण में सभी घंटे 1 से क्यों शुरू होते हैं? क्या यह देर से रेस्तरां है? क्या आपको 24h प्रारूप की परवाह है? क्या आप वहां एएम और पीएम चाहते हैं? आधे घंटे की वृद्धि की अनुमति है? प्रश्नों का उत्तर देने के लिए –

उत्तर

2

सोचा मैं इस पर एक bash होगा।

टेस्ट तालिका

CREATE TABLE `opening_hours` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `eateries_id` int(11) DEFAULT NULL, 
    `day_of_week` int(11) DEFAULT NULL, 
    `start_time` time DEFAULT NULL, 
    `end_time` time DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

टेस्ट डाटा

INSERT INTO `test`.`opening_hours` 
(
`eateries_id`, 
`day_of_week`, 
`start_time`, 
`end_time`) 
SELECT 2 AS eateries_id, 1 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 2 AS eateries_id, 1 AS day_of_week, '17:00' AS start_time, '20:00' as end_time union all 
SELECT 2 AS eateries_id, 2 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 2 AS eateries_id, 2 AS day_of_week, '17:00' AS start_time, '20:00' as end_time union all 
SELECT 2 AS eateries_id, 3 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 2 AS eateries_id, 4 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all 
SELECT 2 AS eateries_id, 5 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 2 AS eateries_id, 6 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all 
SELECT 2 AS eateries_id, 7 AS day_of_week, '13:00' AS start_time, '21:00' as end_time 
                     union all 
SELECT 3 AS eateries_id, 1 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 3 AS eateries_id, 2 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 3 AS eateries_id, 3 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 3 AS eateries_id, 4 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all 
SELECT 3 AS eateries_id, 5 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all 
SELECT 3 AS eateries_id, 6 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all 
SELECT 3 AS eateries_id, 7 AS day_of_week, '13:00' AS start_time, '21:00' as end_time 

देखें परिभाषा ही साथ सन्निहित दिनों की 'द्वीप' को खोजने के लिए

CREATE VIEW `test`.`groupedhours` 
AS 
    select `test`.`opening_hours`.`eateries_id` AS `eateries_id`, 
     `test`.`opening_hours`.`day_of_week` AS `day_of_week`, 
     group_concat(concat(date_format(`test`.`opening_hours`.`start_time`,'%l'),' - ',date_format(`test`.`opening_hours`.`end_time`,'%l %p')) order by `test`.`opening_hours`.`start_time` ASC separator ', ') AS `OpeningHours` 
     from `test`.`opening_hours` 
     group by `test`.`opening_hours`.`eateries_id`,`test`.`opening_hours`.`day_of_week` 

क्वेरी दिन से खुलने मजबूत करने के लिए घंटे (Itzik बेन गण के बाद एक के आधार पर)

खोलने
SET @rownum = NULL; 
SET @rownum2 = NULL; 



SELECT S.eateries_id, 
concat(CASE WHEN 
S.day_of_week <> E.day_of_week 
    THEN 
    CONCAT(CASE S.day_of_week 
      WHEN 1 THEN 'Su' 
      WHEN 2 THEN 'Mo'  
      WHEN 3 THEN 'Tu'  
      WHEN 4 THEN 'We' 
      WHEN 5 THEN 'Th'  
      WHEN 6 THEN 'Fr'  
      WHEN 7 THEN 'Sa' 
      End, ' - ') 
    ELSE ''   
END, 
CASE E.day_of_week 
    WHEN 1 THEN 'Su' 
    WHEN 2 THEN 'Mo'  
    WHEN 3 THEN 'Tu'  
    WHEN 4 THEN 'We' 
    WHEN 5 THEN 'Th'  
    WHEN 6 THEN 'Fr'  
    WHEN 7 THEN 'Sa' 
End, ' ', S.OpeningHours) AS `Range` 
FROM (

SELECT 
    A.day_of_week, 
    @rownum := IFNULL(@rownum, 0) + 1 AS rownum, 
    A.eateries_id, 
    A.OpeningHours 
FROM `test`.`groupedhours` as A 
WHERE NOT EXISTS(SELECT * FROM `test`.`groupedhours` B 
       WHERE A.eateries_id = B.eateries_id 
        AND A.OpeningHours = B.OpeningHours 
        AND B.day_of_week = A.day_of_week -1) 
ORDER BY eateries_id,day_of_week) AS S 

JOIN (
SELECT 
    A.day_of_week, 
    @rownum2 := IFNULL(@rownum2, 0) + 1 AS rownum, 
    A.eateries_id, 
    A.OpeningHours 
FROM `test`.`groupedhours` as A 
WHERE NOT EXISTS(SELECT * FROM `test`.`groupedhours` B 
       WHERE A.eateries_id = B.eateries_id 
        AND A.OpeningHours = B.OpeningHours 
        AND B.day_of_week = A.day_of_week + 1) 
ORDER BY eateries_id,day_of_week) AS E 

ON S.eateries_id = E.eateries_id AND 
    S.OpeningHours = S.OpeningHours AND 
    S.rownum = E.rownum 

eateries_id    Range 
2    Su - Mo 1 - 3 PM, 5 - 8 PM 
2    Tu 1 - 3 PM 
2    We 1 - 8 PM 
2    Th 1 - 3 PM 
2    Fr 1 - 8 PM 
2    Sa 1 - 9 PM 
3    Su - Tu 1 - 3 PM 
3    We 1 - 8 PM 
3    Th 1 - 3 PM 
3    Fr 1 - 8 PM 
3    Sa 1 - 9 PM 
+1

यह दिलचस्प है। मेरी राय यह है कि एसक्यूएल आपको डेटा तेजी से प्राप्त कर लेना चाहिए क्योंकि यह वही है जो यह सबसे अच्छा है। उच्च स्तर की भाषा का उपयोग करके इसका मालिश सबसे अच्छा किया जाता है (मुझे लगता है)। आपका एसक्यूएल हालांकि प्रभावशाली है। –

2

आप चाहते हैं परिणाम संघ के प्रत्येक दिन के लिए अंतराल का एक समूह। 24 घंटों प्रारूप करने के लिए चिपका (वास्तव में सेकंड के लिए परिवर्तित पहले मुझे लगता है कि) जब तक आप इसे एक मानव दोस्ताना फ़ॉर्मेट में बदलने के लिए है।

http://pyinterval.googlecode.com/svn/trunk/html/index.html

दिक्कत यह है कि जब आप सेकंड ... एक रेस्तरां है जो 1 सेकंड पहले बंद कर देता है याद किया जाएगा :(अनुमति देते हैं शायद आप 15 या 5 मिनट की वेतन वृद्धि के लिए अनुमति देने की जरूरत है। DB में डेटा यदि दौर आपको करना है। तो, दृष्टिकोण यह है: एक अंतराल डेटा संरचना का उपयोग करके, किसी दिए गए दिन के लिए सभी अंतराल को एक साथ जोड़ दें। अब शब्दकोश को उलट दें। अंतराल के लिए मानचित्र मैप करने के बजाय, दिनों में अंतराल मानचित्र करें। अब उन समूहों का प्रतिनिधित्व करने का एक तरीका खोजें उदाहरण के लिए, set(1,2,3) को "मेगावाट" के रूप में प्रदर्शित किया जा सकता है, इसलिए मैं सुझाव दूंगा: सेट {1,2,3,4,5,6,7} (या {1,2,3,4,5}) के प्रत्येक पावर सेट के लिए सर्वश्रेष्ठ मानव प्रतिनिधित्व (हाथ से) ढूंढें। अब इस तर्क को हार्ड-कोड करें - इसे एक डी में सहेजें ctionary जो क्रमबद्ध स्ट्रिंग (यह महत्वपूर्ण है) जैसे "एम-डब्ल्यू, एफ" जैसे मानव प्रतिनिधित्व के लिए "1235" क्रमबद्ध है। ऊपर दिए गए लिंक में वर्णित एक अंतराल ऑब्जेक्ट के साथ काम करने के बाद, 1-3, 5-8 प्रदर्शित करना आसान है। सौभाग्य! मुझे बताएं कि आप किस समस्या में भागते हैं।

संपादित करें:

यह वह जगह है नहीं सबसे अच्छा उदाहरण है कि वे (ओवरलैपिंग अंतराल के मिलन प्रदर्शित नहीं करता है), लेकिन आप के बारे में परवाह "|" ऑपरेटर

unioned: 

>>> interval[1, 4] | interval[2, 5] 
interval([1.0, 5.0]) 

>>> interval[1, 2] | interval[4, 5] 
interval([1.0, 2.0], [4.0, 5.0]) 

तुम बस इस वर्ग अपने आप को लागू कर सकता है, लेकिन यह कीड़े होने का खतरा हो सकता है।

+0

यहां मैं मान रहा था कि सोम = 1, ट्यू = 2, ... सूर्य = 7 क्योंकि यह कुछ देशों में एक सम्मेलन है - सप्ताह सोमवार को शुरू होता है और रविवार को समाप्त होता है। http://www.cjvlang.com/Dow/SunMon.html –

+0

मुझे लगता है कि मैं समझ रहा हूं कि आप क्या कह रहे हैं .. हालांकि दिन के सौ से अधिक संयोजन नहीं होंगे जो मुझे कठिन कोड करना होगा? – vee

+0

काफी नहीं, 2^5 = 32; 2^7 = 128 :) हालांकि, ये उत्पन्न किए जा सकते हैं। –

संबंधित मुद्दे