• 30-08-2014, 23:41:11
    #1
    Arkadaşlar merhaba. Sorun hakkında forumda araştırma yaptım ancak hiç biri benim istediğim türden çözümler değil. distinct ve group by tam olarak işimi görmüyor maalesef. Olay şu;

    Wordpress kullanıyorum. post_title bölmesi hep şu şekilde "Sanatçı - Şarkı1" , "Sanatçı - Şarkı2", "Sanatçı - Şarkı3" .

    Benim yapmak istediğim, sorgumda a harfi ile başlayan sanatçıları listelerken bu kayıtlardan yalnız birini alsın. Yani Sanatçı Sanatçı Sanatçı şeklinde değilde, Sanatçı, Sanatçı1 , Sanatçı2 şeklinde olmasını istiyorum. Zaten daha sonrasında explode komutuyla ben sondaki şarkı ismini siliyorum. post_title bölmesinde hem sanatçı ismi hem şarkı ismi olduğu için group by ve distinct işimi görmüyor maalesef.

    Kullandığım sorgu
    $sorgu = mysql_query("SELECT post_title FROM wp_posts WHERE post_title LIKE '$harf%'");
  • 31-08-2014, 00:22:56
    #2
    XYZ
    Kimlik doğrulama veya yönetimden onay bekliyor.
    post_title sütununun hep "Sanatçı - Şarkı1" şeklinde olduğunu varsayıyorum.

    Şöyle işinizi görebilir:

    $sorgu = mysql_query("SELECT SUBSTRING_INDEX(post_title,' - ',1) AS SANATCI_ADI  FROM wp_posts WHERE post_title LIKE '$harf%'GROUP BY SANATCI_ADI");
    
    while($sanatci=mysql_fetch_assoc($sorgu)) {
       echo $sanatci['SANATCI_ADI'].'<br/>';
    }
  • 31-08-2014, 00:27:22
    #3
    ilk başta akla bunu sql ile çözmek geliyor. wp_posts'ları birbirine join edip if ve substr ile title'ın bi kısmı çekilip kontrol edilebilir.

    kaç satırdan bahsediyoruz ? eğer çok değilse bunun sonuçlarını döndürdüğünüz yerde bir kontrol yapabilirsiniz. bir performans analizi yapın işinizi görüyorsa devam edersiniz değilse sorgu düzenlenebilir.

    $sorgu = mysql_query("SELECT post_title FROM wp_posts WHERE post_title LIKE '".mysql_real_escape_string($harf)."%'");
    $oncekisifir ="";
    while($sorgusonuc=mysql_fetch_assoc($sorgu)) {
    // şeklinde döndürüyorsunuz muhtemelen. ve explode ile bölüp son kısmı aldığınızı söylüyorsunuz. sanıyorum - gibi bi karakterden bölüyorsunuz. eğer ilk SANATÇI ADI - ŞARKI şeklinde ise şarkı için explodedangelen[1] 'i alıyorsunuzdur. o zaman explodedangelen[0] ile bir önceki kaydı kontrol edebilirsiniz. şöyle ki;
    $parcala = explode($sorgusonuc['post_title'],"-");

    if($parcala[0] != $oncekisifir) {
    // farklı bir sanatçı gelmiş. burada işleminizi yapabilirsiniz.
    }

    $oncekisifir = $parcala[0];
    } //while'ın kapanışı.

    bu mantıkla bir ilerleyin. dediğim gibi performansa göre şekillenir de algoritmanız.

    edit : mysql_real_escape_string($harf) sql injection
    edit2: $oncekisifir while dışında başlatılmalı
  • 31-08-2014, 00:39:32
    #4
    Öncelikle değerli cevaplarınız için teşekkür ederim arkadaşlar gerçekten çok yardımı oldu. Sizin dedikleriniz ile birlikte 3 farklı yol oluşturdum sanıyorum. Ben de konudan cevap beklerken şöyle bir mantık kurdum;

    Array dizi mantığıyla gitmeye çalıştım. While dışında bir değişkene 0 değerini atayıp while içinde bunu sürekli arttırdım ve array içinde kullandım. Ve birde if ile de bu değişkenin bir eksiğiyle aynı olup olmadığına bakarak bir sonuca vardım.

    Şu şekilde

    say = 0;
    
    while ($liste = mysql_fetch_array($sorgu))
    {
    $say++;
    
    $list1 = explode("-", $liste['post_title']);
    $liste1 = $list1[0];
    
    $dizi[] = $liste1;
    
    if ( $dizi[$say] == $dizi[$say-1] ) {} else {
    	
    	echo $dizi[$say];
    
    }}
    Hangi yol daha işlevseldir onu tam kestiremedim ancak. Tekrardan teşekkür ediyorum.
  • 31-08-2014, 18:10:36
    #5
    Üyeliği durduruldu
    distinct kullanımını araştırmalısınız. unique şeklinde benzersiz bir çağırım yapabilir. Yada array içine alıp verileri uniqe_array fonksiyonu kullabilirsiniz.

    http://php.net//manual/tr/function.array-unique.php