Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Veritabanından çekilen verileri aşağıdan yukarı doğru listeleme

Konu, 'SQL' kısmında dinlex tarafından paylaşıldı.

  1. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Merhabalar, soracağım soru belki de çok basit ama işin içinden çıkamadım. Beynimi sulandırdım yine sanırım :)

    Şimdi "mesajlar" ismindeki veritabanımda "mesaj_id" ve "mesaj" olarak 2 sütun var. 5 tane mesaj kayıtlı şu şekilde;
    mesaj_id, mesaj
    1, deneme1
    2, deneme2
    3, deneme3
    4, deneme4
    5, deneme5

    Bunlardan son kaydolan 3 tanesini (3., 4. ve 5.'yi) çekmek istiyorum.
    "ORDER BY mesaj_id ASC LIMIT 3" yapsam olmaz, ilk üçünü çeker "1, 2, 3" şeklinde.

    "ORDER BY mesaj_id DESC LIMIT 3" yapsam yine olmaz. Bu sefer son üçünü çeker AMA "5, 4, 3" şeklinde son paylaşılan yukarda olacak şekilde listeler, ben "3, 4, 5" şeklinde son paylaşılan altta olacak şekilde listelemek istiyorum.
    Yani şöyle;
    3, deneme3
    4, deneme4
    5, deneme5

    Yöntemini bilen var mı?

    Edit: Yazmayı unutmuşum, PHP ve MySQL kullanıyorum.
     
    Son düzenleme: 14 Şubat 2018
  2. gk

    gk Üye

    Kayıt:
    24 Aralık 2009
    Mesajlar:
    147
    Beğenilen Mesajlar:
    21
    Meslek:
    Yazılım Geliştirici
    Şehir:
    İstanbul
    Kısa yoldan nasıl yapılır bilmiyorum ama MySQL için benim yöntemim şu :
    1) Bir View oluşturun :
    Kod:
    CREATE
        VIEW `myview1`
        AS
    (SELECT * FROM mesajlar ORDER BY mesaj_id DESC LIMIT 3);
    
    2) Oluşturduğunuz View'i çağırın :
    Kod:
    SELECT * FROM myview1 ORDER BY mesaj_id ASC
    
     
    Son düzenleme: 14 Şubat 2018
    dinlex bunu beğendi.
  3. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Dürüst olmak gerekirse bu view olayını ilk kez duyuyorum/okuyorum. Öncelikle nedir ne değildir bir araştırayım. Çok sağolun :)
     
    Son düzenleme: 14 Şubat 2018
  4. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    View'e baktım ama sanırım o da aynı şekilde "5, 4, 3" şeklinde sıralıyor. Mantık aynı gibi, sadece karmaşık sorguları çekerken biraz daha basite indirgiyor.

    Ben sağlam kafayla tekrar bi uğraşınca iki sorguyla yapabildim.
    PHP:
    $cekilecekLimit 3;
    $mesajlar mysql_query("SELECT * FROM mesajlar");
    $mesajSayisi mysql_num_rows($mesajlar);

    $baslangic  $mesajSayisi $cekilecekLimit;

    $mesajlar mysql_query("SELECT * FROM mesajlar ORDER BY mesaj_id ASC LIMIT $baslangic$mesajSayisi");
    Önce mesajlar tablosunda kaç mesaj olduğuna baktım. 5 mesaj olduğunu farzedelim. Ondan sonra toplam mesaj sayısından listelemek istediğim mesaj sayısını çıkardım (5-3=2). İkinci sorguda da LIMIT ile 2 ile 5 arasındaki mesajları ASC ile sıralarım. Böylece son 3 mesaj "3,4,5" şeklinde listelenecek.
     
  5. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Ama arkadaşlar bir mesjlaşma sistemi için böyle 2 sorgu yapmak sistemi çok yormaz mı? Facebook'taki arkadaşlarınızla karşılıklı sohbet ettiğinizi düşünün, her mesaj atışınızda böyle sorgu çalışacak 2 tane.
     
  6. wurucu

    wurucu Üye

    Kayıt:
    28 Ağustos 2008
    Mesajlar:
    138
    Beğenilen Mesajlar:
    7
    Meslek:
    Öğrenci
    Şehir:
    Mersin
    SELECT * FROM Mesajlar WHERE mesaj_id in (SELECT mesaj_id FROM mesajlar ORDER BY mesaj_id DESC LIMIT 3) ORDER BY mesaj_id

    in olayı mysqlde varmıydı hatırlayamadım genellikle mssqlde çalışıyorum. Select içinde select çekmek çok kastıran bir işlem değildir. (Tabi tablonun boyutu ve içinde çekilen sorguyada bağlı olarak durum değişir)
    Kastıran asıl işlem sorgu sonucunda çıkan sonucun socket aracılığıyla kullandığınız projeye gönderme işleminde oluşur.
    Bu gibi durumlar için select komutlarında işinize yaramayan columnları çıkarmanız(* kullanmamanız) ve sadece kullanacağınız columnların çıkmasını sağlayarak ciddi performans artışı sağlayabilirsiniz.
     
    dinlex bunu beğendi.
  7. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Evet son zamanlarda onu iyi anladım ben. Kullanmadığım bir tane bile varsa çıkarıyorum hemen. Yine de söylediğiniz için teşekkürler. Ama verdiğiniz yöntem çalışmadı nedense. MySQL'de de IN sorgusu var, kullanıyorum da bazı yerlerde ama burda işe yaramadı.

    Normalde "mesaj_id IN (4,5,6)" şeklinde araya virgül koyduğumuz zaman çalışıyor. Ama parantez arasına sorgu koyunca çalışmıyor.
     
  8. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Ufak bir detay: Parantez içindeki "LIMIT 3" kısmını silince sorgu çalışıyor. 'LIMIT 3'ü koyunca boş çıkıyor. LIMIT 3'ü silince de zaten bir işe yaramıyor.
     
  9. MaviAteş

    MaviAteş Aktif Üye

    Kayıt:
    23 Mart 2007
    Mesajlar:
    440
    Beğenilen Mesajlar:
    5
    Meslek:
    Bilgisayar Sistemleri Öğretmeni
    Şehir:
    Başakşahir, İstanbul
    Şu an Mysql ortamı bulamadım, w3schools webSql 'de TEK SQL cümlesi denedim olmadı.

    Şöyle yapabilirsiniz.
    İlk önce

    $kactane = Select Count(*) From Tablo komutuyla tabloda kaç kayıt olduğunu bir değişkene alırsınız.
    Daha sonra
    Son 3 mesaj için,

    SELECT * FROM tablo ORDER BY id ASC LIMIT $kactane-3 , 3

    Sizin örneğinizde,
    SELECT * FROM tablo ORDER BY id ASC LIMIT 2 , 3

    yazmış olacaksınız.
     
  10. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Ben de yukarıda 3. yorumda iki sorgu ile yapabildiğimi yazmıştım zaten. Aynı şeyi söylediniz ama yardımcı olduğunuz için teşekkür ederim yine de. Sadece tek sorguda olursa heralde daha kolay olur diye düşündüm. Hem sistemi daha az yorar hem de sayfalama işlemi yaparken kolayıma gelirdi ama bu şekilde kullanacam artık 2 sorguyla.

    Yardımcı olmaya çalışan herkese teşekkürler ve sevgiler... Tabi tek sorguyla yapan olursa yazabilir yine, hayır demem :))
     
  11. wurucu

    wurucu Üye

    Kayıt:
    28 Ağustos 2008
    Mesajlar:
    138
    Beğenilen Mesajlar:
    7
    Meslek:
    Öğrenci
    Şehir:
    Mersin
    Hatanın sebebi kullandığınız mysql sürümüyle alakalıymış.
    Çözüm için benim sevmediğim inner join yöntemiyle subquery kullanım gerekiyor.
    Şöyle :

    Kod:
    SELECT 
           * 
    FROM 
           Mesajlar  AS t1 
    INNER JOIN 
           (SELECT mesaj_id  FROM Mesajlar ORDER BY mesaj_id  DESC LIMIT 3) as t2
    ON 
           t1.mesaj_id  = t2.mesaj_id 
    ORDER BY
           t1.mesaj_id 
    
     
    dinlex bunu beğendi.
  12. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Çok sağolun, oldu valla. Ama anlamadığım bir şey var "LIMIT 3" yazınca 1 tane mesaj listeliyor, LIMIT 5 yazınca 3 tane listeliyor. Ben ne kadar arttırsam da hep 2 tane eksik listeliyor. Veritabanında sorun yok. Kodları da burada paylaşayım hatta bir de siz bakın.
    PHP:
    $query mysql_query("SELECT * FROM mesajlar AS m1
    INNER JOIN uyeler ON uyeler.uye_id = m1.mesaj_gonderen
    INNER JOIN (SELECT mesaj_id FROM mesajlar ORDER BY mesaj_id DESC LIMIT 3) AS m2 ON m1.mesaj_id = m2.mesaj_id
    WHERE ((m1.mesaj_gonderen = "
    .$get_id." AND m1.mesaj_alan= ".$kullanici.") OR (m1.mesaj_gonderen = ".$kullanici." AND m1.mesaj_alan= ".$get_id."))
    ORDER BY m1.mesaj_id ASC"
    );
     
    Son düzenleme: 15 Şubat 2018
  13. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    @wurucu Üstteki mesajlarda kendi bulduğum yöntemle birbirinden ayrı 2 farklı sorguyla yapınca bu eksik mesaj olayı çıkmıyor. Ama sizin verdiğiniz bu yöntemle 2 mesaj eksik oluyor hep.
     
  14. wurucu

    wurucu Üye

    Kayıt:
    28 Ağustos 2008
    Mesajlar:
    138
    Beğenilen Mesajlar:
    7
    Meslek:
    Öğrenci
    Şehir:
    Mersin
    Kod:
    SELECT
           *
    FROM
           Mesajlar  AS t1
    INNER JOIN
           (SELECT mesaj_id  FROM Mesajlar ORDER BY mesaj_id  DESC LIMIT 3) as t2
    ON
           t1.mesaj_id  = t2.mesaj_id
    ORDER BY
           t1.mesaj_id
    
    bu kod mu eksik sonuç çıkartıyor ? Eğer üzerinde düzenleme yaptığınız hali eksik çıkartıyor ise :

    Kod:
    SELECT
           *
    FROM
           Mesajlar  AS t1
    INNER JOIN
           (SELECT mesaj_id  FROM Mesajlar ORDER BY mesaj_id WHERE KOŞULLAR  DESC LIMIT 3) as t2
    ON
           t1.mesaj_id  = t2.mesaj_id
    ORDER BY
           t1.mesaj_id
    
    Sorgu koşullarını "KOŞULLAR" diye belirttiğim kısıma ekleyip deneyin. Öbür türlü çıkan 3 sonucun içerisinde filtreleme yapmış olursunuz
     
    dinlex bunu beğendi.
  15. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Aman yaa, ben nasıl öyle bir düşüncesizlik yaptım. K.bakmayın valla uğraştırdım sizi de. Çok sağolun şimdi denedim gayet güzel oldu. :)
     
  16. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Oysa anlamam gerekirdi çektiğim o 3 mesajın içinde başkasına ait mesajların da olabileceğini ama işte...
    Sanırım yaş ilerleyince beyin yoruluyor gerçekten. Son zamanlarda bunu sık yaşamaya başladım.

    Yardımcı olan herkese teşekkürler... @wurucu ayrıca teşekkür ederim :)
     
    wurucu bunu beğendi.