SQL - Bir sorgusuna belirli bir satır olacak nerede bulun

7 Cevap php

Ben bir forumları sistem üzerinde çalışıyorum. Ben kullanıcıların yaptık mesajları görmek için izin çalışıyorum. Bu yeni bir özellik olduğundan çalışmak için bu linki için için, ben onlar kendi yazı içerdiği gönderdi belirli bir konu üzerinde page atlamak gerekiyordu, bu yüzden yer imleri, vb işe yarayabilir Eski bir forum, ben forum sistemi her yazının takip etmek zorunda değildir bu yüzden kod istiyorum, ama sadece otomatik olarak bu listeyi doldurabilirsiniz.

Ben listesini doldurmak için nasıl biliyorum, ama ben bunu yapmak gerekir:

Sorgu içinde irade X satır (tanımlayıcılannın bazı kombinasyonu ile benzersiz olmasını garanti) bir sorgu, verilen görünür? Olarak, kaç satır ben bunu almak için ofset olurdu? Bu kriteri sorguda olacaktır.

İdeal olarak, SQL ve değil PHP ile yapmak istiyorum, ancak SQL yapılamaz eğer ben de bir cevap sanırım. ^ _ ^

Teşekkürler

7 Cevap

hmm bu çözüm birkaç varsayımlar yapar, ama bunu ben doğru anlamak yapmak için çalışıyoruz ne için çalışması gerektiğini düşünüyorum:

SELECT count(post_id) FROM posts
  WHERE thread_id = '{$thread_id}' AND date_posted <= '{$date_posted}'

Bu size eşit, ya da (söz konusu belirli kullanıcı sonrası) yayınlanan tarihten daha eski olan (i önceden hesaplanmış ettik varsayalım) bir iş parçacığı satır sayısını elde edecek.

Bu bilgilerin (bu iş parçacığı 15 yazı demek) dayalı, sonuç değerleri sayfalama forumlarında dayalı olacağını hangi sayfa hesaplayabilirsiniz. yani

// dig around forum code for number of items per page
$itemsPerPage = 10; // let's say
$ourCount = getQueryResultFromAbove(); 

// this is the page that post will be on
$page = ceil($ourCount / $itemsPerPage);

// for example
$link = '/thread.php?thread_id='.$thread_id.'&page='.$page;

Eğer MSSQL kullanıyorsanız, bir sorguda her satır için otomatik artan bir numara eklemek için ROW_NUMBER() işlevini kullanabilirsiniz.

Ben olsa size ne yapacağını iyi bilmiyorum. Ama sen ne sordu yapacak - Belirli bir sorgunun sonuç kümesi içinde bir satırın konuma bir numara atayın.

Bu olsa ph yazılmış, muhtemelen mySQL kullanıyorsunuz.

Veritabanları hakkında bir şey onlar için hiçbir gerçek "düzen" olmasıdır. Sen eklenen kaydın benzersiz kimliğini dönmek için SCOPE_IDENTITY operatörünü kullanabilirsiniz, o kayıt bulunana kadar sayfalandırmamayı fonksiyonu çeşit mal.

Ben muhtemelen daha fazla ayrıntı bilmek lazım bunu düzeltmek için, yanlış bu etrafında gidiyoruz, Troy ile katılıyorum, ama MySQL her durumda böyle yapabilirsiniz

SET @i=0;
SELECT number FROM (SELECT *,@i:=@i+1 as number FROM Posts 
ORDER BY <order_clause>) as a WHERE <unique_condition_over_a>

PostgreSQL geçici bir diziyi kullanabilirsiniz:

CREATE TEMPORARY SEQUENCE counter;
SELECT number FROM (SELECT *,nextval('sequence') as number FROM Posts 
ORDER BY <order_clause>) as a WHERE <unique_condition_over_a>

Troy'un önerisi üzerine genişletilmesi, bir alt sorgu gerekir ediyorum, temelde,

 select row_number() OVER(ORDER BY MessageDate DESC) 
 AS 'RowNum', * from MESSAGES

sonra gerçek işler yapmak için bir dış seçin koydu:

  select RowNum, Title, Body, Author from (
  select row_number() OVER(ORDER BY MessageDate DESC) 
  AS 'RowNum', * from MESSAGES)
  where AuthorID = @User

Sayfa sayısını hesaplamak için rownum kullanın.

Çoğu SQL platformlar KİMLİK sütun veya bir tablodaki her öğe ile artırmak dizilerinin özel bir uzantısı var. Çoğu da geçici tablolar var.

KİMLİK KOLON İLE SORGULAMA SONUÇLARI TABLO OLUŞTURMA

INSERT INTO TABLE
QUERY
ORDER BY something

sonra kimlik sütun sorguda sayı ve kaç girişleri önce / ondan sonra söyler.

Önemli olan şey tarafından sipariş etmektir. Aksi takdirde farklı emir numaranız şey demektir ki bu durumda her bir sorgu alabilirsiniz ...

Ben (MySQL) böyle bir şey demek düşünüyorum?

START TRANSACTION;

SET @rows_count = 0;
SET @user_id = ...;
SET @page_size = ...;

SELECT 
     @rows_count := @rows_count + 1 AS RowNumber
    ,CEIL( @rows_count / @page_size ) AS PageNumber
FROM ForumPost P
WHERE 
    P.PosterId = @user_id;

ROLLBACK;