Doğru Cevap
-
Order by asc ilk kaydi verir son kaydi istiyorsan desc yapman lazim. Ten kayit icin group by yapman lazim.
-
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
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
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
GROUP BY resim.tarih ile de doğru sonuç alamadım.11 yıl önce yazılmış -
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
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
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
Ş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
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
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ı.