Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

LEFT JOIN ile bağlanan tablodan tek ve son veriyi çekme

merhaba arkadaşlar,
bir saattir başlıkta belirttiğim işlemi yapmaya çalışıyorum fakat beceremedim :(.
resim tablosundan tek veri çekebiliyorum fakat son veriyi değilde ilk veriyi alabiliyorum. kodum şu şekilde..

SELECT yazi.id, yazi.baslik, resim.id
FROM yazi
LEFT JOIN ( SELECT yaziid, tarih FROM resim ORDER BY tarih DESC LIMIT 1 ) as resim ON resim.yaziid = yazi.id
ORDER BY yazi.tarih ASC
LIMIT ...


nerde hata yapıyorum arkadaşlar?
  • GROUP BY resim.yaziid kısmını GROUP BY resim.tarih yazarmısın oraya atlamışım.
    Kesali 11 yıl önce yazdı
  • Biraz bakındım yanlış birşey söylememek için söyle bir soru buldum baya benzer verilen cevapta bizim sorguya yakın. Performansa etkisindende bahsetmişler. http://stackoverflow.com/questions/4580479/mysql-left-join-group-by-and-order-by-not-working-as-required cevaptaki sorguyu incelersen daha iyi anlarsın.
    Kesali 11 yıl önce yazdı
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Doğru Cevap

  • Kesali adlı üyenin fotoğrafı
    11 yıl önce yazılmış
    208 cevap - 2 soru
    Order by asc ilk kaydi verir son kaydi istiyorsan desc yapman lazim. Ten kayit icin group by yapman lazim.
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      hocam ben yazı tablosu değilde resim tablosundaki son kaydı çekmek istiyorum. o sorgumda da zaten DESC yapıyorum fakat nafile.
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Böyle denermisin.
      SELECT yazi.id, yazi.baslik, resim.id
      FROM yazi
      LEFT JOIN ( SELECT yaziid, tarih FROM resim ORDER BY tarih DESC ) as resim ON resim.yaziid = yazi.id
      GROUP BY resim.yaziid
      ORDER BY yazi.tarih ASC
      LIMIT ...
      
      11 yıl önce yazılmış
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      hocam bu şekilde sonuncu veriyi alabildim fakat garip bir şekilde verilerim eksik geldi.
      GROUP BY resim.yaziid olan kısmı GROUP BY yazi.id olarak değiştirdim verilerim doğru gelmeye başladı fakat bu seferde sorgum çok yavaşladı. normalde 0.010 gibi bir zamanda tamamlanan sorgum 0.030 lara çıktı. yani 3 kat yavaşladı.
      11 yıl önce yazılmış
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      GROUP BY resim.tarih ile de doğru sonuç alamadım.
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Sorgunda mantık hatası vardı. Şöyle göstereyim.
      Aşağıdaki kısım sadece bir kayıt çeker ve bunu resim olarak tablona ekler. ON kısmı ise dönen tek kayıt içinde tutan yaziid yi arar sonuç her seferende aynı olur. Yani on kısmı herhangibir karşılaştırma yapamaz.
      Yavaşlamada olması doğal alt sorgundan bir tane veri dönerken şu an tüm resimler dönüp içinde id si uyanları sıralıyor vs. SELECT yaziid, tarih FROM resim ORDER BY tarih DESC LIMIT 1 şu sorgunu tek başına çalıştır ne kadar zaman alacağını görürsün.

      LEFT JOIN ( SELECT yaziid, tarih FROM resim ORDER BY tarih DESC LIMIT 1 )
      
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Performance olayına bir ekleme bu tip alt sorgu kullanımlarında her bir yazi için bu sorgu tekrar tekrar çalışır ve gelen sonuçlar içinde sıralama yapar.
      İki ayrı sorgu halinde yapsan çok daha performanslı olur.
      11 yıl önce yazılmış
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      hocam yok gönderdiğiniz linke de baktım çıkamadım işin içinden. bana kalsa şu şekilde olması lazımdı ama olmuyor nedense.

      SELECT yazi.id, yazi.baslik, resim.id
      FROM yazi
      LEFT JOIN resim ON resim.yaziid = yazi.id
      GROUP by yazi.id
      ORDER BY yazi.tarih ASC, resim.tarih DESC
      LIMIT ...
      


      heralde iki sorgu yapmam gerekecek. pes etmekte istemiyorum ama .. neyse teşekkür ederim hocam desteğin için.
      11 yıl önce yazılmış
    • Kesali adlı üyenin fotoğrafı Kesali
      Şu an tüm resim ve yazı tablolarındaki verileri çekiyor. Eğer sisteminizde tüm yazıları ve resimleri göstermicekseniz zaten where id='$id' kullanacağınız için sorgunuzdaki yavaşlık azalacatır.
      Genel sorun şu ikinci select sorgusu her bir yazı kadar tekrarlanıyor ve gelen sorgular içinden sıralama karşılaştırma vs yapıyor performansı olumsuz etkileyen kısmı orası.
      ON resim.yaziid = yazi.id kullandığınıza göre her bir yazı için birden fazla resim var. Eğer yoksa LEFT JOIN resim ON resim.yaziid = yazi.id zaten size doru sonucu verir.
      İki tane select kullandığınız için iki ayrı sorgu yapmak ile iki tane select kullanmak arasında bir fark yoktur.
      Eğer join kısmı çok öenmli değilse iki sorgu yapıp tüm resimleri bir array içine atıp id si tutanları arrayden çekin hepsinde performanslı olacaktır.
      11 yıl önce yazılmış
    • bensedat18 adlı üyenin fotoğrafı bensedat18
      iki sorguyla hallettim hocam. bu şekilde dediğiniz gibi çok bi performans kaybı da yaşamadım. teşekkür ederim ilginiz için.
      11 yıl önce yazılmış
    • genckan adlı üyenin fotoğrafı genckan
      Dostum yerinde olsam 2 sorgu calistiracagima table function olustururdum. Hem daha derli toplu olur, hemde projenin gelisim asamasinda gelisime acik olur.
      11 yıl önce yazılmış

Cevaplar

Hiç cevap bulunamadı.