• 23-08-2013, 21:07:07
    #1
    Merhabalar;
    Arkadaşlar tek bir SQL sorgusu ile bazı şartları sağlayan değerleri çekmek istiyorum.
    Yardımcı olabilirseniz sevinirim.

    Hemen soruya geçeyim.

    İki adet tablom var

    haber
    yorum

    haber tablom
    - id
    - baslik
    - icerik

    yorum tablom
    - id
    - haber_id
    - yorum_icerik

    Bu tablolara göre 5'ten fazla yoruma sahip olan haberlerin sadece başlığını nasıl çektirebilirim?


    Açıklama ben bunun uzun yolunu yapabiliyorum.

    ( While döngüsü ile gelen haber id'sini alıp while içinde yorum tabloma num_rows sorgusu çekiyorum ve if şartı ile 5'ten büyükse basliklarini yazdırıyorum. )

    Ama bu sizde taktir edersenizi ki profesyonelce değil.


    Yardımcı olan arkadaşlara şimdiden teşekkür ediyorum.
  • 23-08-2013, 21:57:47
    #2
    $sorgu = mysl_query("SELECT count(yorum.haber_id) as toplam,haber.baslik 
    FROM yorum 
    INNER JOIN haber ON yorum.haber_id = haber.id
    GROUP BY yorum.haber_id
    HAVING toplam >= 5");
    while($veri = mysql_fetch_assoc($sorgu)){
    	
    	echo $veri['baslik'] ."<br />";
    
    }
    olması lazım
  • 23-08-2013, 22:11:37
    #3
    İnner joinle tablolari baglayip daha sonra yorumlari haber id ye gore gruplayip eger sayi 5 ten buyukse sarti eklersiniz bu sekilde sorguyu yazacaktim ama telefonda zorlu oluyo


    Sent from my iPhone using Tapatalk
  • 23-08-2013, 22:13:53
    #4
    İnner join kullanımı yoğun kullanıcı içeren sistemleri gerektiğinden daha fazla yormaktadır. Amatörce tabir ettiğimiz iç içe sorgu daha performanslı olabiliyor bazı durumlarda.
  • 24-08-2013, 01:18:14
    #5
    Bu tarz hesaplama yaparsanız sistemde çok fazla veri olmasa dahi sisteminiz yorulacaktır. Yorulmasa dahi normalde 100 ms yanıt süresi olan scriptiniz 900 ms - 1500 ms arasında bir zamanda yanıt verecektir. Bu nedenle haber tablosuna yorum adlı bir alan açarak her yorum eklendiğinde o alandaki sayıyı arttırın. Zaten sonrasını biliyorsunuzdur;

    SELECT baslik FROM haber WHERE yorum > 4 LIMIT 10
  • 24-08-2013, 04:54:29
    #6
    Üyeliği durduruldu
    yada sadece o bölümü cacheleyerek inner join kullanabilirsiniz..
  • 24-08-2013, 09:23:56
    #7
    Arkadaşlar yardımlarınız için teşekkür ederim.

    Sorun hem fatihsarac arkadaşımızın verdiği sorgu ile hemde sewakldawk arkadaşımın verdiği pratik tablo ayarları ile 2 alternatifli olarak çözülmüştür.


    İyi günler dilerim.
  • 24-08-2013, 11:47:21
    #8
    Üyeliği durduruldu
    Modexi adlı üyeden alıntı: mesajı görüntüle
    Merhabalar;
    Arkadaşlar tek bir SQL sorgusu ile bazı şartları sağlayan değerleri çekmek istiyorum.
    Yardımcı olabilirseniz sevinirim.

    Hemen soruya geçeyim.

    İki adet tablom var

    haber
    yorum

    haber tablom
    - id
    - baslik
    - icerik

    yorum tablom
    - id
    - haber_id
    - yorum_icerik

    Bu tablolara göre 5'ten fazla yoruma sahip olan haberlerin sadece başlığını nasıl çektirebilirim?


    Açıklama ben bunun uzun yolunu yapabiliyorum.

    ( While döngüsü ile gelen haber id'sini alıp while içinde yorum tabloma num_rows sorgusu çekiyorum ve if şartı ile 5'ten büyükse basliklarini yazdırıyorum. )

    Ama bu sizde taktir edersenizi ki profesyonelce değil.


    Yardımcı olan arkadaşlara şimdiden teşekkür ediyorum.
    Başka bir yol daha

    SELECT baslik FROM haber WHERE id IN (SELECT haber_id FROM yorum GROUP BY haber_id HAVING COUNT(haber_id) > 5)
  • 24-08-2013, 13:21:16
    #9
    Modexi adlı üyeden alıntı: mesajı görüntüle
    Arkadaşlar yardımlarınız için teşekkür ederim.

    Sorun hem fatihsarac arkadaşımızın verdiği sorgu ile hemde sewakldawk arkadaşımın verdiği pratik tablo ayarları ile 2 alternatifli olarak çözülmüştür.


    İyi günler dilerim.
    ben kodu paylaştım ama belirtmeyi unuttum, daha doğrusu vaktim yoktu

    kullanmanı tavsiye eder miyim?

    kesinlikle hayır! çünkü bir kere grup by var işin içinde, count var, join var. bunlar küçük veritabanlarında, sistemlerde sıkıntı çıkartmazlar pek fakat işler büyüyünce veritabanı katili olurlar. mecbursan bunları kullanmaya bir defa çekip, cache yapmak en mantıklısıdır. her kullanıcı için tekrar tekrar sorgulatmak hiç mantıklı değildir.

    bu konuda en mantıklı çözüm @sewakldawk ın da dediği gibi haber tablosunda yorum_sayisi bölümü oluşturup, onaylı her yorumda 1 arttırmaktır.