MySQL sorgusu sonucu bir öğenin al

4 Cevap php

Bütün set kateden bir sorgu sonucu bir belirli bir öğenin sırasını bilmek için bir yol var mı?

Ben Ajaxified şekilde kullanıcı yorumlarını göstermek bir web uygulaması var, ben bu gibi onların yorumlarına kullanıcıya bir link göndermek istiyorum:

http://my.web/post/12345#comment%5F45

ve karma değer "comment_45" kullanarak verilen açıklama ile açıklama sayfasını yüklemek, ama ben bütün sonucu geçme ile sağ sayfayı nasıl bilmiyorum.

Teşekkür ederim

4 Cevap

Ben nasıl ve nerede bu URL oluşturulur bilmiyorum, ama ben bunu URL oluşturulduğunda hangi comment biliyorsanız, daha sonraki bir tarih ve saatte bilmeli üstlenecek. Her comment benzersiz bir kimliği var gibi geliyor (ki öyle değil eğer gerektiği).

Ben comment_45 belirli bir sayfada belirli bir yorum başvurmak zorunda Yorum retreiving güvenilir bir yol olduğunu sanmıyorum, daha sonra (ne başka bir açıklama daha önceki sayfa veya başka bir sayfada silinirse? Ne kaç yorum ekran üzerinde değiştirirseniz sayfa? vb)

Comments bir kimliği var, ve URL "comment_45" aslında bu kimliği ise, sadece Yorumu almak için aşağıdaki genel SQL sorgusu kullanabilirsiniz:

select field1, field2, ... fieldn from comments where comment_id = id;

Bu durumda, id URL (comment_45 olan "45" bölümü) tarafından sağlanan açıklama kimliği ile bir değişken olur. Bu bilgi güvenilmeyen bir kaynaktan (internet) geliyor gibi, SQL enjeksiyonu önlemek için girdiyi emin olmak isteyeceksiniz.

Yorumlarınızı mantıklı bir şekilde sıralanır? Onlar her zaman birinci gelen son (ya da ilk son) için sayısal sırayla görüntülenir iseniz) yorumların toplam sayısı sadece bir bilerek dayanan üzerinde ne sayfa hesaplamak gerekir, b) sayfa başına yorumların sayısı.

SQL veritabanında Satırlar tanım sıralanmamıştır. Sonraki sorgularda aynı düzeni garanti etmek için, yan tümcesi "tarafindan" bir içermelidir. Ardından, aşağıdaki sorgu ile istediğinizi yapabilirsiniz

SELECT * FROM `your_table` ORDER BY `date_entered` LIMIT 45, 1

Satırlar sorgular arasına yerleştirilir veya silinirse, sonuçlar kullanıcının beklediği tam olarak ne olmayacak, ancak sipariş ile alan bir tarih-zaman ise bu genellikle bir sorun değildir.

Ben yeterince olgun değildir düşünüyorum çünkü ben MySQL depolanan yordamları kullanarak karşı genelde ama ben bu oluşturmak için klasik bir durum olduğunu düşünüyorum.

Biz hala iki sorgu, açıklamanın sipariş almak için bir tane ve ilgili satırları getiriliyor için bir tane olması gerekmektedir ancak sınır değerlerini çalıştırmadan önce bilinmesi gerekir beri ben 1 tek sorgu içinde başarmış için daha yaratıcı bir şey bulamadı sorgu.

Biz büyük sonuçlar setleri bahsetmiyoruz zaman durumlarda, o sadece tüm sonuçları ve yorumları sipariş alıp sonra sadece ilgili sayfa yorumları görüntülemek için array_slice kullanmak daha verimli olabilir.

/* get the comment order */
SET @commentOrder = 0;
SELECT commentOrder INTO @relevantCommentOrder FROM (
        SELECT commentID, @commentOrder := @commentOrder+ 1 as commentOrder
        FROM COMMENTS
        ORDER BY creationDate) commentsOrder
    WHERE commentID= 45;
/* get the value we want to use in the LIMIT clause */
SET @startFrom = CONVERT(ROUND(ROUND(@relevantCommentOrder/10)*10) ,UNSIGNED);
/* fetch relevant results */
PREPARE STMT FROM 'SELECT * FROM COMMENTS LIMIT ?,10';
EXECUTE STMT USING @startFrom;

Bir sonraki size ayarlanmış tüm sonuçlar almak ve all rows olarak açıklamanın emri vereceğini 1 sorgu yani sonra sadece PHP içindeki ilk satırın relevantCommentOrder alanını kontrol edin ve daha sonra görüntülemek istiyorum bu yüzden dizi doğrayabiliyordu ayarlanmış tüm sonuçlar çok büyük değilse sadece ilgili yorumlar, bu bir tek etkilidir.

SET @commentOrder = 0;
SELECT *, @relevantCommentOrder;
    FROM (
   SELECT commentID, @commentOrder := @commentOrder+ 1 as commentOrder, 
           @relevantCommentOrder := case when commentID = 45 
                                        then @commentOrder 
                                        else @relevantCommentOrder end 
      FROM COMMENTS
      ORDER BY creationDate ) subQuery;