Possible Duplicate:
What is the SQL for 'next' and 'previous' in a table?
Ben bir tablodan bir sonraki veya bir önceki kayıt almak için daha iyi bir yol bulmaya çalışıyorum. Diyelim ki bir blog veya haber tablo var diyelim:
CREATE TABLE news (
news_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
news_datestamp DATETIME NOT NULL,
news_author VARCHAR(100) NOT NULL,
news_title VARCHAR(100) NOT NULL,
news_text MEDIUMTEXT NOT NULL
);
I news_id
, ben gibi oldukça basit bir şey yapabilirsiniz göre sıralama yaşıyorum Şimdi önyüzü ben, sonraki veya önceki kayıtları için gezinti düğmelerini istiyorum:
SELECT MIN(news_id) AS next_news_id FROM news WHERE news_id > '$old_news_id' LIMIT 1
SELECT MAX(news_id) AS prev_news_id FROM news WHERE news_id < '$old_news_id' LIMIT 1
Ama haber herhangi bir alana göre sıralanabilir, ve ben mutlaka sıralanır hangi alan bilmiyorum, yani bu iş olmaz eğer kullanıcı news_author
, örneğin üzerinde sıralar.
Ben ihtiyacım kaydını bulana kadar ben tüm tabloyu sıralama ve tüm kayıtların döngü içinde oldukça çirkin ve verimsiz yönteme başvurdu ettik.
$res = mysql_query("SELECT news_id FROM news ORDER BY `$sort_column` $sort_way");
$found = $prev = $next = 0;
while(list($id) = mysql_fetch_row($res)) {
if($found) {
$next = $id;
break;
}
if($id == $old_news_id) {
$found = true;
continue;
}
$prev = $id;
}
Daha iyi bir yolu olmalı var.
Düzenleme, açıklamalar:
Neden sınırını kullanmak Yüklü? Ben bilmiyorum mevcut kaydının sonuç kümesinde konumunu bilmek gerekir. Bu tipik pagination vardı ve ben ?startpage=n
o zaman evet bu işe yarar gibi sorgu dizeleri olsaydı, ben sadece $startpage
artırmak verebilir ve sorguya LIMIT $startpage,1
ekleyin. Ama ben news/news_id-news-title-here
?news_id=n
için yeniden olduğunu gibi adresler var, bu yüzden startpage ne olduğunu bilmiyorum. Ben yaptım bile, ne kullanıcı bir harici link üzerinden orada alırsa? Ne kullanıcı geçerli sayfayı okurken yeni mesaj eklenirse?
Çok yukarıda örnek özelliklerine takılıp kalmayınız, asıl soru şudur:
Given a unique record id and an arbitrary sort column, is there a way to determine which records fall immediately before and after that specific record, without looping through the entire record set.