• 23-08-2009, 01:33:08
    #1
    Arkadaşlar ben içerikleri sayfalarken her kategoriden sadece bir içeriği sayfalamak istiyorum. Bunun içinde " GROUP BY catid " diye yazmam yeterli aslında. Ama bu sorguda bunu yazmak da işime yaramıyor.

    Bu sorunumu ancak usta PHP'ciler çözer.

    Örnek sorgulama:

    <?
    for($i=0;$i<10;$i++)
    	{
    $veri=mysql_fetch_array( mysql_query("SELECT jos_content.id, jos_content.title, jos_categories.image, jos_categories.name,"
    . "\n jos_content.catid, jos_content.sectionid"
    . "\n FROM jos_content"
    . "\n INNER JOIN jos_categories ON jos_content.catid = jos_categories.id"
    . "\n INNER JOIN jos_sections ON jos_content.sectionid = jos_sections.id"
    . "\n WHERE jos_content.sectionid='4'"
    . "\n ORDER BY jos_content.created"
    . "\n DESC LIMIT $i,1"));
    
    ?>
    WHERE bölümü section id 'yi sınıyor ve sadece 4'ncü bölümdeki kategorilerin listelenmesine izin veriyor.

    ORDER BY bölümü ise kategorilerdeki içerikleri tarihlerine göre listeledikten sonra, en son yazılan 10 içeriği veriyor.

    Şimdi bu iki ölçüyü de ortadan kaldırmadan kategori tekrarını önlemek istiyorum. Ama GROUP BY catid diye yazdığım zaman ORDER BY bölümündeki ilkeyi boşa çıkarıyor, yani tarihe göre en son yazılanları dizmiyor artık.

    Bana bir kod verin ki en son eklenenler içinden 10 içeriği listeleyim ve üstelik kategorilerde tekrar olmasın.

    Yardımınızı bekliyorum
  • 23-08-2009, 04:10:07
    #2
    Üyeliği durduruldu
    kategoride tekrar olmasın ile kastınız nedir?
  • 23-08-2009, 05:18:15
    #3
    Kimlik doğrulama veya yönetimden onay bekliyor.
    LEft join kullanarak denedin mi?
  • 23-08-2009, 11:09:27
    #4
    sdemirkeser adlı üyeden alıntı: mesajı görüntüle
    kategoride tekrar olmasın ile kastınız nedir?
    Bir sürü kategorim var. Bugün Sürrealizm kategorisine 10 tane içerik atmışsam, anasayfada da bunlar çıkıyor. Yani anasayfa sürrealizm ile doluyor. Oysa ben istiyorum ki anasayfada her kategorinin son içeriği listelensin.
    Şu anda aşağıda gösterdiğim MySQL sorgum çalışıyor, sadece kategoride tekrarı engelleyemiyorum.
    Aşağıdaki sorguda:
    Kategori adı ve konu başlığı içeriğin eklenme tarihine göre listeleniyor.


    leonjade adlı üyeden alıntı: mesajı görüntüle
    LEft join kullanarak denedin mi?
    Teşekkür ederim.
    Sanırım sorun o değil. Çünkü;

    INNER JOIN
    LEFT JOIN
    FULL OUTER JOIN
    RIGHT OUTER JOIN
    LEFT OUTER JOIN
    CROSS OUTER JOIN

    segmentlerinin yapacağı iş değil. Bunlar tablolar arasında bağlantı sağlar. Ben bağlantımı sağlamışım zaten, hata vermiyor o açıdan. Sadece filtreleme sorunum var.

    Hocaların fikir ve önerilerini bekliyorum.
  • 23-08-2009, 12:36:54
    #5
    tablo yapını çok iyi bilmediğim için aklımda oluşturduğum Kategori ve Yazı tablolarıyla örnekliyorum;

    SELECT   ID, (SELECT CONCAT("<a href='Yazilar.php?ID=",ID,"'>",Baslik,"</a>") FROM Yazilar WHERE KatID = K.ID ORDER BY ID DESC LIMIT 1)
    
       FROM  Kategoriler K
    yukardaki örnekte kategorileri listeleyip, her kategoriden en son yazıyı listeleme yapabiliyoruz. burdaki sorun şu ki ordaki yazıları listeleyen sub query den sadece 1 alan geri dönebiliriz. birden fazla alan geri dönmeye çalışırsak hata verir diye tahmin ediyorum (: 1 den çok alana ihtiyacımız varsa bunu sorguda CONCAT yardımı ile birleştirip gönderip bunu da php ile işlemek mümkün. mesela sub query den "ID#Baslik#Bilmemne" formatında tek bir alanda CONCAT ile birleştirip geri dönersek bu dönen veriyi alıp php de split ederek 3 alan elde etmiş oluruz. umarım kendimi ifade edebilmeyi başarmışımdır (:
  • 23-08-2009, 12:49:30
    #6
    Üyeliği durduruldu
    şöyle birşey yazalım

    select distinct(kategoriId),id from TABLON group by kategoriId order by id desc limit 10

    benzersiz kategorili olan son 10 içeriğin id sini yazdırır bu

    yazinin adini , içeriğinide kendine göre düzenleyip alabilirsin
  • 23-08-2009, 13:24:43
    #7
    saho adlı üyeden alıntı: mesajı görüntüle
    şöyle birşey yazalım
    select distinct(kategoriId),id from TABLON group by kategoriId order by id desc limit 10
    benzersiz kategorili olan son 10 içeriğin id sini yazdırır bu
    yazinin adini , içeriğinide kendine göre düzenleyip alabilirsin
    Bu şekilde hata veriyor:
    <?
    		for($i=0;$i<10;$i++)
    	{
    $veri=mysql_fetch_array( mysql_query("SELECT DISTINCT (catid) jos_content.id, jos_content.title, jos_categories.image, jos_categories.name,"
    . "\n jos_content.catid, jos_content.sectionid"
    . "\n FROM jos_content"
    . "\n INNER JOIN jos_categories ON jos_content.catid = jos_categories.id"
    . "\n INNER JOIN jos_sections ON jos_content.sectionid = jos_sections.id"
    . "\n WHERE jos_content.sectionid='4'"
    . "\n ORDER BY jos_content.created"
    . "\n DESC LIMIT $i,1"));
    ?>
    DISTINCT (catid) meselesini ya ben uyduramıyorum, ya da uymuyor.


    ismailperim adlı üyeden alıntı: mesajı görüntüle
    tablo yapını çok iyi bilmediğim için aklımda oluşturduğum Kategori ve Yazı tablolarıyla örnekliyorum;
    SELECT   ID, (SELECT CONCAT("<a href='Yazilar.php?ID=",ID,"'>",Baslik,"</a>") FROM Yazilar WHERE KatID = K.ID ORDER BY ID DESC LIMIT 1)
       FROM  Kategoriler K
    yukardaki örnekte kategorileri listeleyip, her kategoriden en son yazıyı listeleme yapabiliyoruz. burdaki sorun şu ki ordaki yazıları listeleyen sub query den sadece 1 alan geri dönebiliriz. birden fazla alan geri dönmeye çalışırsak hata verir diye tahmin ediyorum (: 1 den çok alana ihtiyacımız varsa bunu sorguda CONCAT yardımı ile birleştirip gönderip bunu da php ile işlemek mümkün. mesela sub query den "ID#Baslik#Bilmemne" formatında tek bir alanda CONCAT ile birleştirip geri dönersek bu dönen veriyi alıp php de split ederek 3 alan elde etmiş oluruz. umarım kendimi ifade edebilmeyi başarmışımdır (:

    Sorun şu ki ilk başta yazdığım MySQL sorgumun bir filtreye ihtiyacı var. Tablolar arasındaki bağlantı tamamdır, sadece kategorileri filtrelemem lazım.

    GROUP BY catid diye yazmam yeterli aslında. Ama böyle yapınca da en son eklenen kategorilere göre filtreleme yapıyor, en son eklenen içeriklere göre değil. Burdaki pürüzü de gidersem yine sorun çözülür.

    Ustalar yardım lütfen.
  • 23-08-2009, 13:50:28
    #8
    ilk sorgudaki en son bölümdeki limit kısmını kaldırıp deneyebilir misin ?
  • 23-08-2009, 14:09:21
    #9
    ismailperim adlı üyeden alıntı: mesajı görüntüle
    ilk sorgudaki en son bölümdeki limit kısmını kaldırıp deneyebilir misin ?
    O zaman tek bir kategoriden 10 tane içerik sıralıyor. GROUP BY catid yazdığım halde.

    İlginçtir, GROUP BY catid 'i kaldırınca da başka bir kategoriden 10 tane sıralıyor.

    Aslında bu ilginç sonuçları not almam lazım, ama sorunum o kadar kafamı kurcalıyor ki, şu anda labarotuvar çalışması gibi not alacak durumda değilim.