MySQL

2013-04-23 9 views
6
पर दो संख्याओं के बीच एक दृश्य का चयन करें

मैं इस तालिका MySQL पर दो तिथियों के साथ people नामित किया है:MySQL

| Name | start_date | end_date | 
| John | 2007-03-01 | 2009-10-12 | 
| Mike | 2001-06-06 | 2010-12-01 | 

मैं एक दृश्य मुझे गतिविधि साल से खोजने देता है बनाना चाहते हैं, गतिविधि साल किसी भी किया जा रहा है start_date और end_date के बीच वर्ष। तो, मैं इस तरह वर्ष की एक अनुक्रम के साथ एक क्षेत्र पाने के लिए, चाहते हैं:

| Name | activity_years         | 
| John | 2007,2008,2009         | 
| Mike | 2001,2002,2003,2004,2005,2006,2007,2008,2009,2010 | 

मैं कुछ दृष्टिकोण की कोशिश की है, लेकिन मैं इसे नहीं कर सकते। चूंकि मैं एक दृश्य बनाना चाहता हूं, मुझे इसे सब कुछ एक कथन कथन के अंदर करना है और यह मुझे कुछ सिरदर्द दे रहा है।

+0

कुछ भी नहीं है कि उल्लेख worths। चयन के अंदर कुछ लूपों का प्रयास किया, और अनुक्रम बनाने वाली प्रक्रिया तैयार की, लेकिन मुझे इसे काम नहीं मिला, शायद इसलिए कि मुझे कुछ याद आ रहा था। –

उत्तर

5

कुछ इस तरह यह करना चाहिए: -

SELECT a.Name, GROUP_CONCAT(YEAR(DATE_ADD(a.start_date, INTERVAL b.aNum YEAR))) AS activity_years 
FROM person a 
CROSS JOIN (SELECT a.i + b.i * 10 AS aNum FROM integers a, integers b) b 
WHERE YEAR(DATE_ADD(a.start_date, INTERVAL b.aNum YEAR)) <= YEAR(a.end_date) 
GROUP BY a.Name 

यह एक स्तंभ मैं कहा जाता है के साथ पूर्णांकों का एक मेज पर निर्भर करता है, मूल्यों के साथ 0 9 को यह संख्या की श्रेणी प्राप्त करने के लिए अपने आप के खिलाफ इस मिलती है 0 से 99 तक, इसलिए तिथि के साथ प्रतियां बहुत दूर हैं।

subselects निकाला जा रहा है एक दृश्य में उपयोग करने के लिए

SELECT p.Name, GROUP_CONCAT(YEAR(DATE_ADD(p.start_date, INTERVAL (a.i + b.i * 10) YEAR))) AS activity_years 
FROM person p 
CROSS JOIN integers a 
CROSS JOIN integers b 
WHERE YEAR(DATE_ADD(p.start_date, INTERVAL (a.i + b.i * 10) YEAR)) <= YEAR(p.end_date) 
GROUP BY p.Name 
+0

यदि ओपी को नई स्थायी सहायता तालिका बनाने के लिए स्वीकार्य लगता है तो इसे सालाना कॉल करना बेहतर होगा और इसमें सभी संभावित वर्षों को स्टोर करना होगा (उदाहरण के लिए 1 9 80-2050) और डेटा प्राप्त करने के लिए बस उस तालिका में शामिल हों? –

+0

उचित बिंदु और संभवतः सत्य। तिथि सीमाओं पर निर्भर करता है, इसका कितनी बार उपयोग किया जाता है, आदि। उदाहरण के लिए यदि तिथि सीमाएं जन्मदिन की तारीख और पूर्वजों की मृत्यु तिथि एक हजार साल बाद जा रही हैं तो यह थोड़ा कम लचीला हो सकता है। इसके अलावा यदि इसे सीमा में सभी महीनों और वर्षों के लिए विस्तारित किया जाना था तो उपरोक्त के साथ करना आसान है। – Kickstart

+0

उप-चयन – Kickstart

4

SQLFiddle demo

select name, 
     group_concat(tYears.row ORDER BY tYears.row) 
    from people 

join 

(
SELECT @row := @row + 1 as row FROM 
(select 0 union all select 1 union all select 3 union all select 4 union all 
    select 5 union all select 6 union all select 6 union all select 7) t, 
(select 0 union all select 1 union all select 3 union all select 4 union all 
    select 5 union all select 6 union all select 6 union all select 7) t2, 
(select 0 union all select 1 union all select 3 union all select 4 union all 
    select 5 union all select 6 union all select 6 union all select 7) t3, 

(SELECT @row:=1900) t21 
) tYears 

on tYears.row between year(start_date) and year(end_date) 
group by name 
+0

मैं इसे पूरी तरह से समझ नहीं पा रहा हूं, लेकिन मैं इसे किसी भी तरह से चलाने के लिए नहीं मिल सकता। ऐसा लगता है कि एक सादे चयन पर ठीक से काम करता है, लेकिन मैं इस चयन को एक दृश्य में नहीं डाल सकता। मुझे यह त्रुटि मिलती है: 'त्रुटि 1349: दृश्य का चयन FROM क्लॉज SQL स्टेटमेंट' –

+2

में एक सबक्वायरी है यह काफी सरल है। बड़ी संख्या में परिणाम प्राप्त करने के लिए यह कुछ चयनों के परिणामों में शामिल हो रहा है (प्रत्येक चयन 8 पंक्तियों को वापस ला रहा है, इसलिए 512 पंक्तियां लौटाई गई हैं), और प्रारंभिक चर (यानी @row) के चयन के विरुद्ध उसमें शामिल होना 1 9 00 पर सेट करें। फिर यह प्रत्येक पंक्ति के लिए एक बार वापस वैरिएबल लाता है, प्रत्येक बार 1 जोड़ता है। इसलिए 1 9 01 से 2413 तक एक रेंज दे रही है। फिर यह उस चर के किसी भी अवसर को त्याग देता है जो प्रारंभ डेटा और समाप्ति तिथि के वर्ष के बीच नहीं है, और फिर शेष वर्ष को एक ही क्षेत्र में वापस लाने के लिए GROUP_CONCAT का उपयोग करता है। – Kickstart

+0

स्पष्टीकरण के लिए धन्यवाद, हालांकि यह अभी भी काम नहीं करेगा क्योंकि विचारों पर उपखंड सीमा। –

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