2010-12-16 12 views
7

द्वारा आदेश नहीं मैं एक प्रश्न का नाम द्वारा आदेश दिया है कि इस तरह वापसी की है श्रीमती:Mysql करें अगला & पिछला पंक्ति आईडी

ID  NAME 
2121927 AAA 
2123589 AAB 
2121050 AAC 
2463926 BBB ---> known ID 
2120595 CCC 
2122831 DDD 
2493055 EEE 
2123583 EEF 

मैं ज्ञात की अगली आईडी और पिछला आईडी पता होना (यदि मौजूद है) की जरूरत है आईडी & & NAME केवल 1 क्वेरी के साथ यह कैसे संभव है?

+0

आप 2 प्रश्नों में यह कर सकते हैं, examp देखना le कैसे: http://stackoverflow.com/questions/1259458/sql-pulling-a-row-for-next-or-previous-row-of-a-current-row –

+0

@ हैम, आप दो प्रश्नों में शामिल हो सकते हैं एक संघ के साथ, क्या आप नहीं कर सकते? –

उत्तर

11
SELECT *, 
     'next' 
    FROM table 
    WHERE `name` > 'BBB' 
ORDER BY `name` 
    LIMIT 1 

UNION 

    SELECT *, 
     'previous' 
    FROM table 
    WHERE `name` < 'BBB' 
ORDER BY `name` DESC 
    LIMIT 1 

आप विशेष BBBname फ़ील्ड मान नहीं जानते हैं - आप SELECT name FROM table WHERE id = 42, जहां 42 जाना जाता ID मूल्य है की तरह सबक्वेरी से बदलने सकता है।

+0

lol, क्षमा करें :) मेरे पास अगली पंक्ति के साथ सही परिणाम था, पिछली पंक्ति पहली थी क्योंकि मैंने एएससी द्वारा डीईएससी को आदेश दिया था। – Luca

+0

यदि आप एकाधिक (और nonunique) कॉलम द्वारा ऑर्डर करते हैं तो क्या होगा? –

+0

@ Matěj Koubík: आपको स्थिरता के लिए एक और कॉलम जोड़ने की आवश्यकता है, उदाहरण के लिए प्राथमिक कुंजी – zerkms

-4

मैंने इसे ऐसा किया:
यह सबसे तेज़ नहीं है, लेकिन यह फ़ील्ड के आदेश की परवाह नहीं करता है।
डीबी से सभी पंक्तियों को आप जिस क्रम में चाहते हैं उसे पूछें।
वर्तमान आईडी खोजने के लिए php foreach का उपयोग करें।
वर्तमान आईडी का सरणी सूचकांक प्राप्त करें, अनुक्रमणिका +1 या अनुक्रमणिका -1 बनाएं।

$current_id = 6;
$data = get_all_data_from_db();
foreach($data as $index=>$row) {
if($current_id == $row['id']) {
$next = $index+1;
$prev = $index-1;
}
$previous_row = $data[$prev];
$next_row = $data[$next];

+0

गंभीरता से? एक 'foreach'? स्वीकृत उत्तर पर जब दो सरल प्रश्नों के 'यूनियन' का उपयोग करके एक अच्छा साफ समाधान होता है। – Yaroslav

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