Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

2 tablodan veri çekerken karşılaştığım sorun

Konu, 'ASP.NET / Silverlight / Moonlight' kısmında tst tarafından paylaşıldı.

  1. tst

    tst Aktif Üye

    Kayıt:
    27 Ocak 2009
    Mesajlar:
    270
    Beğenilen Mesajlar:
    4
    Merhabalar gene ben :)
    Articles ve Categories diye 2 tablom var.

    Eki Görüntüle 11577


    Anasayfada kategorileri çekerken o kategoriye ait kac tane yazı oldugunu da göstermek istiyorum fakat şöyle bir sorguda

    Kod:
    SELECT CatName ,COUNT(Articles.CID) from Categories INNER JOIN Articles ON Categories.CatId=Articles.CID group by Articles.CID


    gibi bir hata alıyorum.ben hem kategori adını hem de o kategoriye bağlı makale sayısını nasıl çekebilirim?
     
  2. Hakki Eser

    Hakki Eser Daimi Üye

    Kayıt:
    26 Aralık 2010
    Mesajlar:
    639
    Beğenilen Mesajlar:
    0
    Meslek:
    Yazılım Uzmanı
    Şehir:
    İstanbul
    SELECT CatName ,COUNT(1) AS MakaleSayisi from Categories T1 INNER JOIN Articles T2 ON T1.CatId=T2.CID group by T2.CID

    şöyle bir dene..
     
  3. tst

    tst Aktif Üye

    Kayıt:
    27 Ocak 2009
    Mesajlar:
    270
    Beğenilen Mesajlar:
    4
    Column 'Categories.CatName' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    Aynı hata malesef
     
  4. Cihan Yakar

    Cihan Yakar Daimi Üye

    Kayıt:
    8 Temmuz 2003
    Mesajlar:
    5,886
    Beğenilen Mesajlar:
    1
    Şehir:
    Ankara
    Articles.CID 'e göre grupladığın için başka sütun alamazsın. Gruplamayı genişletmelisin.
     
  5. tst

    tst Aktif Üye

    Kayıt:
    27 Ocak 2009
    Mesajlar:
    270
    Beğenilen Mesajlar:
    4
    Mysql ile mssql de group by farklı çalışıyor sanırım.ben şu şekilde çalıştırdığımda niye sonuç alamıyorum

    SELECT CatName ,COUNT(Articles.CID) from Categories INNER JOIN Articles ON Categories.CatId=Articles.CID

    Sonuçta articles.cid den ne kadar varsa da çekmiyormu bu sorgu.burdaki gruplamanın mantığı nedir.
    dediğiniz gibi gruplamayı genişlettim bu seferde
    gibi bir hata verdi.mysql i arar oldum bunun yüzünden
     
  6. bselvan

    bselvan Daimi Üye

    Kayıt:
    15 Ocak 2012
    Mesajlar:
    739
    Beğenilen Mesajlar:
    1
    Şehir:
    İstanbul
    Kod:
    SELECT CatName,(SELECT COUNT(Articles.CID) FROM Articles A WHERE A.CID=C.CatId) As Toplam FROM Categories C
    
    Mysql'de ilk yaptığın şekilde olur. Ama MSSQL de daha farklı. Yukarıdaki sorgu ilk yazdığın sorgu ile aynı işi görecektir.
     
  7. Cihan Yakar

    Cihan Yakar Daimi Üye

    Kayıt:
    8 Temmuz 2003
    Mesajlar:
    5,886
    Beğenilen Mesajlar:
    1
    Şehir:
    Ankara
    @bselvan yazmış ama neden CatName gelmiyor söyleyim, sen tüm kayıtları CID a göre grupluyorsun. Yani kaç tane farklı CID varsa o kadar satır gelecektir. Şimdi CatName i istediğinde Aynı CID a sahip olan kayıtlardan hangisinin CatName'i gelsin diye beklersin?

    Daha somut bir örnek vereyim öğrencileri sınıflarına göre grupladın. 1a,2a,2b diye sınıf sayısı kadar yanıt geldi. Sen öğrenci numarasını istiyorsun ve o sınıftan hangi öğrencinin kaydı gelsin istiyorsun?

    Bu sebeple gruba CatName'i de katman gerekir. Ya da bselvan'ın yazdığı gibi bir sorgu yazman gerekir.
     
  8. tst

    tst Aktif Üye

    Kayıt:
    27 Ocak 2009
    Mesajlar:
    270
    Beğenilen Mesajlar:
    4
    Tamam şimdi kafamda şekillendi.Teşekkür ederim ikinizede
     
  9. Hakki Eser

    Hakki Eser Daimi Üye

    Kayıt:
    26 Aralık 2010
    Mesajlar:
    639
    Beğenilen Mesajlar:
    0
    Meslek:
    Yazılım Uzmanı
    Şehir:
    İstanbul
    Kbma aceleyle cevap yazdım bu örneklerin dışında "View" ile de yapabilirsin. Güzelde olur :)

    Abi birde türkçe kullanabilirsen değişken isimlerini tablo isimlerini daha iyi olur senin açından.
     
  10. Cihan Yakar

    Cihan Yakar Daimi Üye

    Kayıt:
    8 Temmuz 2003
    Mesajlar:
    5,886
    Beğenilen Mesajlar:
    1
    Şehir:
    Ankara
    Türkçe ya da İngilizce kullanmasında problem yok. Ama melezleşince problemler çıkmaya başlıyor. Örneğin bu tabloyu tasarlayan ile bu sorguyu yazanlar aynı kişi olsun (şu an öyle değil ama):

    Kod:
    SELECT CatName,(SELECT COUNT(Articles.CID) FROM Articles A WHERE A.CID=C.CatId) As Toplam FROM Categories C
    
    sorgudan geriye iki sütun dönüyor biri CatName diğeri Toplam :D işte bu her şeyi karıştırıyor. Kod yazarken bir şeyleri genelde ezberlemeye gerek yoktur. Metot isimleri ve değişkenler ne iş yapıyorsa içinde ne barındıyorsa açık ve net şekilde söylemelidir hatta isminden private ya da public olduğunu, metot ya da değişken olduğunu vs anlayabilmeliyim. Şimdi her şeyin ingilizce yazıldığı bir ortamda ben bu sorgudan dönen toplamı kullanmak istediğimde ilk yazacağım .Sum olacaktır haliyle :) . Önceden Türkçe isimlendirmeyi daha çok severdim ama anladım ki iş öyle yürümüyor. İsimlendirmeleri sürekli standart tutmak gerekli. Bunun için bile tool kullanıyorum ama doğal olarak Türkçe isimlendirmelerde işe yaramıyorlar. Örneğin benim Categories adında bir dizim olsun ve bunu foreach ile dönecek olacak olayım. Ben foreach yazdığımda zaten önüme yakından uzağa diziler geliyor ve seçiyorum. Categories i seçtiğimde foreach (var category in categories) şeklinde otomatik oluşturuluyor. Bu Türkçe isimlendirmelerde takdir edersin ki mantıklı çalışmıyor ve foreach i normal yazmak zorunda kalıyorum (vah ne yazık bana :) ). Özet iyi ya da kötü bir standart belirleyin ve proje boyunca o standarttan ayrılmayın. Aradan yıl geçipte o proje üzerinde tekrar çalışmanız gerekirse neyi nerede hangi isimle bulacağınızı sezebilmelisiniz.