2012-11-16 22 views
5
नेस्ट
id title slug summary 
------------------------------ 
1  title1 slug1 summary1 
2  title2 slug2 summary2 
3  title3 slug3 summary3 
4  title4 slug4 summary4 

मैं सभी क्षेत्रों का चयन करने के कोशिश कर रहा हूँ, और इस बीच, चुनिंदा आईडी, शीर्षक और पिछला/अगली पंक्ति के स्लग मेंSimplifing MySQL का चयन करें

SELECT 
    title, slug, summary, id as current_id, 
    (SELECT id FROM table WHERE id < current_id ORDER BY id DESC LIMIT 1) AS prev_id, 
    (SELECT title FROM table WHERE id < current_id ORDER BY id DESC LIMIT 1) AS prev_title, 
    (SELECT slug FROM table WHERE id < current_id ORDER BY id DESC LIMIT 1) AS prev_slug, 
    /* 
    (SELECT id ... ) AS next_id 
    (SELECT title...) AS next_title 
    ... 
    and if there are more fields to select, I have to repeat this (SELECT...) 
    */ 
FROM 
    table 
WHERE 
    id IN (2,3,4); 

क्वेरी काम करता है लेकिन जाहिरा तौर पर यह नहीं है ऐसा करने का स्मार्ट तरीका।

क्या कुछ इसे सरल बनाने में मदद कर सकते हैं? धन्यवाद

+0

एसक्यूएल में एक बेहतर तरीका है - सीमित एसक्यूएल सुविधाओं बस के साथ नहीं MySQL है। –

+1

हम आपसे सीखने के लिए उत्सुक हैं। – 0xC0DEGURU

उत्तर

0

आप एक सबक्वेरी से स्तंभ निकाल सकते:

SELECT 
    title, slug, summary, id as current_id, prev.prev_id, prev.prev_title, prev.prev_slug, next.next_id, next.next_title, next.next_slug 
FROM 
    table, 
    (SELECT id AS prev_id, title AS prev_title, slug AS prev_slug FROM table WHERE id < 2 ORDER BY id DESC LIMIT 1) AS prev, 
    (SELECT id AS next_id, title AS next_title, slug AS next_slug FROM table WHERE id > 2 ORDER BY id DESC LIMIT 1) AS next 
WHERE 
    id = 2; 

लेकिन आप अपने जहां में एक IN खंड का उपयोग करना है, तो यह काम नहीं होगा, आपको id के प्रत्येक मान के लिए यह क्वेरी चलाने की आवश्यकता होगी ...

+0

बहुत बुरा मैं एक बार में कई पंक्तियां ला रहा हूं ... मैंने सोचा कि यह आसान होगा – user1643156

1

ठीक है, मैंने सोचा कि यह आसान होगा। लेकिन एक घंटे के कामकाजी समाधान के बिना, मैं अपने स्वयं के प्रश्न का उत्तर देने के तरीके के बारे में बताऊंगा।

CONCAT_WS का उपयोग कर

SELECT 
    title, slug, summary, id as current_id, 
    (
     SELECT 
      CONCAT_WS(',' id, title, slug) 
     FROM 
      table 
     WHERE 
      id < current_id ORDER BY id DESC LIMIT 1) 
    ) AS prev_data, 
    (
     SELECT 
      CONCAT_WS(',' id, title, slug) 
     FROM 
      table 
     WHERE 
      id > current_id ORDER BY id ASC LIMIT 1) 
    ) AS next_data 
FROM 
    table 
WHERE 
    id IN (2,3,4); 

और परिणाम होगा कुछ

तरह
 
id  => 2 
title  => title2 
slug  => slug2 
summary => summary2 
prev_data => 1,title1,slug1 
next_data => 3,title3,slug3 

तो मैं explode (PHP) prev_data और next_data करने के लिए है जानकारी पाने के लिए।

मैं अभी भी MySQL के साथ ऐसा करने के लिए एक (बेहतर) तरीका ढूंढ रहा हूं।

1

मान लिया जाये कि Id स्तंभ auto_increment है और मूल्यों id के के बीच अंतराल (यानी वे के बीच में के रूप में 1, 2, 3, 4. कोई अंतराल बढ़ती है, की जरूरत नहीं है की तरह 1, 3, 4, 6), तो आप इसे आजमा सकते हैं:

SELECT T.Id AS CurrentId 
    , T.Title AS CurrentTitle 
    , T.Slug AS CurrentSlug 
    , T.Summary AS CurrentSummary 
    , IFNULL(P.Id, -1) AS PreviousId 
    , IFNULL(P.Title, '') AS PreviousTitle 
    , IFNULL(P.Slug, '') AS PreviousSlug 
    , IFNULL(P.Summary, '') AS PreviousSummary 
    , IFNULL(N.Id, -1) AS NextId 
    , IFNULL(N.Title, '') AS NextTitle 
    , IFNULL(N.Slug, '') AS NextSlug 
    , IFNULL(N.Summary, '') AS NextSummary 
    FROM table T 
    LEFT JOIN table P ON P.Id - 1 = T.Id 
    LEFT JOIN table N ON N.Id + 1 = T.Id 
    WHERE T.Id IN (2, 3, 4); 

अन्यथा, आपके द्वारा पोस्ट किया गया उत्तर सही है।

+1

धन्यवाद कैल। आईडी कॉलम _is_ auto_increment, लेकिन समय-समय पर प्रविष्टियों को हटाए जाने के बाद से इसकी कोई गारंटी नहीं दी जा सकती है। यही कारण है कि मुझे उपयोग करना है> और <। – user1643156

+0

मैं देखता हूं। बस एक विचार, यदि आप किसी सर्वर साइड भाषा ['C#', 'Java', आदि] का उपयोग करते हैं, तो हो सकता है कि आप कोड में' पिछले 'और' अगले 'रिकॉर्ड प्राप्त करने का प्रयास कर सकें, क्वेरी में नहीं। बस निष्पादन समय को संतुलित करने की सोच। – KaeL

0

शायद ऐसा कुछ काम करेगा। मैं यह परीक्षण नहीं किया है तो मैं यकीन नहीं है, लेकिन लग रहा है अच्छा :)

SELECT 
    current.title as current_title, 
    current.slug as current_slug, 
    current.summary as current_summary, 
    current.id as current_id, 
    prev.title as prev_title, 
    prev.slug as prev_slug, 
    prev.summary as prev_summary, 
    prev.id as prev_id, 
    next.title as next_title, 
    next.slug as next_slug, 
    next.summary as next_summary, 
    nexrt.id as next_id 
FROM 
    `table` current LEFT JOIN 
    `table` prev ON prev.id = current.id - 1 LEFT JOIN 
    `table` next ON next.id = current.id + 1      
WHERE 
    current.id IN (2,3,4) 
संबंधित मुद्दे