Sorgu sonraki / önceki rekor [yinelenen]

3 Cevap php

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.

3 Cevap

neden siz news_id için kullanılan news_author için aynı şekilde kullanmak değil mi?

EDIT: There is one pitfall: news_author is not unique for sure. So, you will need to order news_author query by 2 fields : news_author, news_id. So, you will need 2 conditions to get next author

Eğer limiti kullanmak Yüklü Neden?

e.g. you listing 10 items per page. Limit 1,10 the next 10 items: Limit 11,10 and so on.

olursa olsun sayfa başına bir ya da 100 öğeleri görüntülemek ise, sistem her zaman aynıdır.

EDIT: daha fazla açıklama Eğer bir ayrıntı sayfası varsa, kesinlikle bir liste aracılığı gelecek, gerekli liste belirli bir sorgu ile oluşturulan, bu nedenle bu listedeki konumunu biliyorum ve detaylara bu param verebilir edildi sayfa. Bir sonraki / önceki bağlantıları var olduğunda yani 1 bir sınırı ile sorgu çağırmak ve sizin params mahsup edebilirsiniz.

EDIT 2: Eğer sipariş dayalı satır konumunu bulmak için bir sorgu kullanabilirsiniz ama bu sadece DESC ile çalışacak:

SELECT  COUNT(*)+1 FROM news ma JOIN news mp ON (mp.$sort_column, mp.news_id) > (ma.$sort_column, ma.news_id) WHERE ma.news_id = $news_id;

in pseudo code: $currentValue = "SELECT $sort_column FROM news WHERE news_id = $current_news_id LIMIT 1"

$operator = ($sort_way == 'ASC')?' > ':' < ';

$nextNewsId = "SELECT news_id FROM news WHERE $sort_column $operator $currentValue ORDER BY $sort_column $sort_way LIMIT 1"

hayır?