2016-02-02 7 views
9

http://sqlfiddle.com/#!9/406cb/2समाप्ति समय के आधार पर पंक्तियों मिल

मैं श्रेणी 1, 2, 3 के साथ एक मेज पुस्तक नहीं है, 4.

  • श्रेणी 1 - 1 घंटे के लिए रहना होगा
  • श्रेणी 2 - होगा 2 घंटे
  • श्रेणी 3 के लिए रहने - 4 घंटे
  • श्रेणी 4 के लिए रहना होगा - 6 बजे
012 के लिए रहना होगा

वांछित परिणाम प्राप्त करने के लिए मैं एक प्रश्न कैसे लिख सकता हूं?

उदाहरण के लिए:

  1. यदि वर्तमान समय +१४५४४११२४८ तो यह सभी पुस्तकों
  2. दिखाना चाहिए यदि वर्तमान समय +१४५४४१४८४७ तो यह वर्ग एक घंटे के बाद नहीं दिखाना चाहिए unixtime = +१४५४४११२४८ (समाप्ति के साथ 1 किताबें है)
  3. यदि वर्तमान समय 1454418448 है तो श्रेणी 1, 2, 3, 4 नीचे 1, 2, 4, 6 घंटे के समाप्त होने के समय के नीचे नहीं दिखाना चाहिए (unix_time गतिशील होगा। उदाहरण के लिए मैंने स्थिर मूल्य का उपयोग किया है)।

इतने पर ..

तालिका:

CREATE TABLE `books` (
    `id` int(255) NOT NULL AUTO_INCREMENT, 
    `name` longtext NOT NULL, 
    `category` varchar(255) NOT NULL, 
    `unix_time` bigint(20) NOT NULL, 
    `time_data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ; 


INSERT INTO `books` (`id`, `name`, `category`, `unix_time`, `time_data`) VALUES 
    (1, 'book1', '1', 1454411248, '2016-02-02 05:37:28'), 
    (2, 'book2', '2', 1454411248, '2016-02-02 05:37:28'), 
    (3, 'book3', '3', 1454411248, '2016-02-02 05:37:28'), 
    (4, 'book4', '4', 1454411248, '2016-02-02 05:37:28'), 
    (5, 'book5', '1', 1454411248, '2016-02-02 05:37:28'), 
    (6, 'book6', '2', 1454411248, '2016-02-02 05:37:28'), 
    (7, 'book7', '3', 1454411248, '2016-02-02 05:37:28'), 
    (8, 'book8', '4', 1454411248, '2016-02-02 05:37:28'), 
    (9, 'book9', '1', 1454497648, '2016-02-03 05:37:28'), 
    (10, 'book10', '2', 1454497648, '2016-02-03 05:37:28'), 
    (11, 'book11', '1', 1454497648, '2016-02-03 05:37:28'), 
    (12, 'book12', '2', 1454497648, '2016-02-03 05:37:28'), 
    (13, 'book13', '3', 1454497648, '2016-02-03 05:37:28'), 
    (14, 'book14', '4', 1454497648, '2016-02-03 05:37:28'), 
    (15, 'book15', '1', 1454497648, '2016-02-03 05:37:28'), 
    (16, 'book16', '2', 1454497648, '2016-02-03 05:37:28'), 
    (17, 'book17', '3', 1454497648, '2016-02-03 05:37:28'), 
    (18, 'book18', '4', 1454497648, '2016-02-03 05:37:28'); 

क्वेरी:

SELECT *, 
    CASE category 
     WHEN '1' THEN '1454407648' 
     WHEN '2' THEN '1454404048' 
     WHEN '3' THEN '1454396848' 
     WHEN '4' THEN '1454389648' 
    END as category 
from books 
where unix_time >1454411248 
+0

@RyanVincent हाय रयान। मैंने sqlfiddle अद्यतन किया है। लेकिन मेरी क्वेरी वास्तव में खराब है। मैं अब एक नेस्टेड क्वेरी आज़माउंगा और फिर से अपडेट करूंगा। – jason

+0

यह cateogory नहीं दिखा रहा है 2,3,4 – jason

+0

@ hjpotter92 – jason

उत्तर

4

सबसे पहले, आप एक मेज की जरूरत है अपने duration मूल्यों के लिए अपने category मूल्यों से संबंधित। आप एक भौतिक तालिका बना सकते हैं, या आप वर्चुअल टेबल उत्पन्न करने के लिए इस तरह की एक सबक्वायरी का उपयोग कर सकते हैं।

select 1 as category, 1 as duration UNION ALL 
    select 2,2 UNION ALL select 3,4 UNION ALL select 4,6 

यह निम्न छोटी लुकअप तालिका उत्पन्न करता है।

|| *category* || *duration* || 
||   1 ||   1 || 
||   2 ||   2 || 
||   3 ||   4 || 
||   4 ||   6 || 

अगला आप अपने books मेज पर कि लुकअप तालिका में शामिल होने का तो जैसे की जरूरत है। दिखाए गए अनुसार, इस क्वेरी में expiration कॉलम भी शामिल हो सकता है।

select b.*, 
     d.duration, 
     FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR expiration 
    from books b 
    join (select 1 as category, 1 as duration UNION ALL 
     select 2,2 UNION ALL select 3,4 UNION ALL select 4,6 
     ) d ON b.category = d.category 

अंत में, आप असमाप्त पंक्तियों को फ़िल्टर करने के एक WHERE खंड जोड़ देते हैं।

select b.*, 
      d.duration, 
     FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR expiration 
    from books b 
    join (select 1 as category, 1 as duration UNION ALL 
     select 2,2 UNION ALL select 3,4 UNION ALL select 4,6 
     ) d ON b.category = d.category 
    where FROM_UNIXTIME(unix_time) + INTERVAL d.duration HOUR >= '2016-02-03 08:00:00' 

इस उदाहरण में मैं वर्तमान समय के रूप में 2016-02-03 08:00:00 इस्तेमाल किया। आप उत्पादन प्रणाली में NOW() का उपयोग कर सकते हैं।

where खंड के sargable संस्करण का उपयोग करने के लिए आप भी स्मार्ट होंगे।

where unix_time >= UNIX_TIMESTAMP('2016-02-03 08:00:00' - INTERVAL d.duration HOUR) 

अंत में, यह एक डिजाइन पसंद है, लेकिन DATETIME और यूनिक्स टाइमस्टैम्प कॉलम मिश्रण एक छोटे से अजीब है।

+1

@ अरथ, टाइपो फिक्स के लिए धन्यवाद। –

+0

हाय। '2016-02-03 08:00:00' के बजाय unixtime के साथ परीक्षण कैसे कर सकते हैं? असल में मैंने यूनिक्स-टाइमस्टैम्प ब्रैकेट के बाहर 1454775825 जोड़ने की कोशिश की लेकिन मुझे एक त्रुटि मिल रही है। – jason

+0

मैंने कोशिश की जहां unix_time> = 1454775825-UNIX_TIMESTAMP (INTERVAL d.duration HOUR) – jason

2

बनाएँ और एक वर्ग तालिका पॉप्युलेट:

  • श्रेणी - आईडी, hours_to_live

पुस्तक को इसमें बदलें:

  • पुस्तक - आईडी, नाम, category_id, unix_time, time_data

और संदर्भ विदेशी के साथ श्रेणी तालिका कुंजी श्रेणी_आईडी।

तो फिर तुम हासिल कर सकते हैं कि आप क्या एक साधारण के साथ चाहते हैं शामिल हों:

सभी की
SELECT b.*, 
    FROM books b 
    JOIN category c 
    ON c.id = b.category_id 
WHERE b.unix_time >= NOW() - INTERVAL c.hours_to_live HOUR 
संबंधित मुद्दे