• 28-12-2021, 22:00:12
    #1
    Merhaba, aşağıdaki kodum @ etiketi atıldığında bir search sistemi mantığı görerek userları çekiyor ancak ben hem userları hemde sayfaları birden çeksin istiyorum, bunu nasıl yapabilirim? Kod aşağıdadır.
    Şimdiden teşekkür ederim


    Bilmeniz gereken fonksiyon: T_USERS , kullanıcı tablosuyken T_PAGES , sayfalar tablosunu yazdıran fonksiyondur.

    function MW_GetFollowingSug($limit, $query) {
    
        global $wo, $sqlConnect;
    
        $data = array();
    
        if ($wo['loggedin'] == false) {
    
            return false;
    
        }
    
        if (empty($query)) {
    
            return false;
    
        }
    
        $query_one_search = " WHERE ((`username` LIKE '%" . MW_Secure($query) . "%') OR CONCAT( `first_name`,  ' ', `last_name` ) LIKE  '%" . MW_Secure($query) . "%')";
    
        $user_id          = MW_Secure($wo['user']['user_id']);
    
        $query_one        = "SELECT `user_id` FROM " . T_USERS;
    
        $query_one .= $query_one_search;
    
        $logged_user_id = MW_Secure($wo['user']['user_id']);
    
        $query_one .= " AND (`user_id` NOT IN (SELECT `blocked` FROM " . T_BLOCKS . " WHERE `blocker` = '{$logged_user_id}') AND `user_id` NOT IN (SELECT `blocker` FROM " . T_BLOCKS . " WHERE `blocked` = '{$logged_user_id}') AND (`user_id` IN (SELECT `following_id` FROM " . T_FOLLOWERS . " WHERE `follower_id` = {$user_id} AND `following_id` <> {$user_id} AND `active` = '1') OR `user_id` IN (SELECT `follower_id` FROM " . T_FOLLOWERS . " WHERE `follower_id` <> {$user_id} AND `following_id` = {$user_id} AND `active` = '1'))) AND `active` = '1'";
    
        $query_one .= " LIMIT {$limit}";
    
        $sql = mysqli_query($sqlConnect, $query_one);
    
        while ($fetched_data = mysqli_fetch_assoc($sql)) {
    
            $user_data           = MW_UserData($fetched_data['user_id']);
    
            $html_fi['id'] = $user_data['id'];
    
            $html_fi['username'] = $user_data['username'];
    
            $html_fi['label']    = $user_data['name'];
    
            $html_fi['img']      = $user_data['avatar'];
    
            $data[]              = $html_fi;
    
        }
    
        if (empty($data)) {
    
            $sql = mysqli_query($sqlConnect, "SELECT `user_id` FROM " . T_USERS . " {$query_one_search} AND `user_id` <> {$user_id} AND `user_id` NOT IN (SELECT `blocked` FROM " . T_BLOCKS . " WHERE `blocker` = '{$logged_user_id}') AND `user_id` NOT IN (SELECT `blocker` FROM " . T_BLOCKS . " WHERE `blocked` = '{$logged_user_id}') LIMIT {$limit}");
    
            while ($fetched_data = mysqli_fetch_assoc($sql)) {
    
                $user_data           = MW_UserData($fetched_data['user_id']);
    
                $html_fi['username'] = $user_data['username'];
    
                $html_fi['label']    = $user_data['name'];
    
                $html_fi['img']      = $user_data['avatar'];
    
                $data[]              = $html_fi;
    
            }
    
        }
    
        return $data;
    
    }
  • 28-12-2021, 22:05:31
    #2
    one to many ilişkisi var sanırım user id'leri üzerinden "WHERE IN" sorgusu çalıştırıp map'lemen gerekli.
    one to many ilişkide iki tablodan aynı sorguda içerik çekemezsin.
    Tabi bunların hepsini doğrulamak için öncelikle tablolarının yapısını da paylaşman lazım müneccim değiliz sonuçta.
    SQL'de lazy loading ve eager loading ve ORM kelimelerini araştırmanı öneririm
  • 28-12-2021, 22:12:33
    #3
    koddizayncom adlı üyeden alıntı: mesajı görüntüle
    one to many ilişkisi var sanırım user id'leri üzerinden "WHERE IN" sorgusu çalıştırıp map'lemen gerekli.
    one to many ilişkide iki tablodan aynı sorguda içerik çekemezsin.
    Tabi bunların hepsini doğrulamak için öncelikle tablolarının yapısını da paylaşman lazım müneccim değiliz sonuçta.
    SQL'de lazy loading ve eager loading ve ORM kelimelerini araştırmanı öneririm
    Teşekkür ederim, dediğinizi araştıracağım. Peki dediklerinizi kod üzerinde örnekleyerek gösterme imkanınız var mı rica etsem?
    Tablo yapısını da paylaşmayı unutmuşum haklısınız, aşağıya bırakıyorum

    iki farklı tablo : mw_users ve mw_pages

    mw_pages tablo yapısı :

    mw_users tablo yapısı :
    ..
  • 28-12-2021, 22:26:07
    #4
    Bu iki tablo arasında many to one ilişki var. Yani her sayfanın bir kullanıcısı var ama her kullanıcının birden fazla sayfası olabilir.

    Bir sayfayı çekerken o sayfa ile birlikte o sayfaya ait kullanıcı verisini de çekmek istiyorsan. Soldaki tabloyu (sayfalar) sağdaki tablo ile birleştirmek için LEFT JOIN kullanabilirsin. Ve ikinci tablodan çekmek istediğin sütunları belirtebilirsin.

    SELECT mw_pages.*, mw_users.username as username, mw_users.first_name as firstname
    
    FROM mw_pages
    
    LEFT JOIN mw_users ON (mw_pages.user_id = mw_users.user_id)
    Bu tüm sonuçları döndürür. İlk tablonun tüm sütunları ile ikinci tablonun seçilen sütunlarını döndürür. Test edemedim kodu ama incelersen "LEFT JOIN" yazdıktan sonraki kısımda iki tabloda eşleşen sütunları belirtiyoruz veritabanı o iki tablodaki user_id aynı olan satırları sanki tek tabloymuş gibi bize döndürüyor.

    Kodu kendine uyarlayabilmen için şu adresi ziyaret edebilirsin. https://www.w3schools.com/sql/sql_join_left.asp

    JOIN, IN, HAVING vs. bunları da araştırmanı tabsiye ederim sorgu performansını aşırı derecede artıracaktır. Çoğu şeyi veritabanı hallediyor zaten aslında.
  • 28-12-2021, 22:41:33
    #5
    koddizayncom adlı üyeden alıntı: mesajı görüntüle
    Bu iki tablo arasında many to one ilişki var. Yani her sayfanın bir kullanıcısı var ama her kullanıcının birden fazla sayfası olabilir.

    Bir sayfayı çekerken o sayfa ile birlikte o sayfaya ait kullanıcı verisini de çekmek istiyorsan. Soldaki tabloyu (sayfalar) sağdaki tablo ile birleştirmek için LEFT JOIN kullanabilirsin. Ve ikinci tablodan çekmek istediğin sütunları belirtebilirsin.

    SELECT mw_pages.*, mw_users.username as username, mw_users.first_name as firstname
    
    FROM mw_pages
    
    LEFT JOIN mw_users ON (mw_pages.user_id = mw_users.user_id)
    Bu tüm sonuçları döndürür. İlk tablonun tüm sütunları ile ikinci tablonun seçilen sütunlarını döndürür. Test edemedim kodu ama incelersen "LEFT JOIN" yazdıktan sonraki kısımda iki tabloda eşleşen sütunları belirtiyoruz veritabanı o iki tablodaki user_id aynı olan satırları sanki tek tabloymuş gibi bize döndürüyor.

    Kodu kendine uyarlayabilmen için şu adresi ziyaret edebilirsin. https://www.w3schools.com/sql/sql_join_left.asp

    JOIN, IN, HAVING vs. bunları da araştırmanı tabsiye ederim sorgu performansını aşırı derecede artıracaktır. Çoğu şeyi veritabanı hallediyor zaten aslında.
    Hocam o kullanıcıya ait sayfayı çektirmek istemiyorum, yapmak istediğim aynı facebooktaki etiketleme mantığı ile aynı örnek veriyorum Eser adında kullanıcım ve Test adında sayfam var, şuanda @eser yazıldığında o kişiyi etiketlemiş oluyor verileri çekip. Ancak @test yazdığımda test isimli kullanıcı olmadığı için hiçbir şey yapmıyor, ben hem sayfaları hemde kullanıcıyı dikkate alsın istiyorum. Bir sayfanın adı bir kullanıcının adı ile aynı olamaz platformumda, dolayısıyla test adında kullanıcı açılmışsa test adında sayfa, test adında sayfa açılmışsa test adında kullanıcı açılamaz.
    Bu dediklerim dikkate alınacak olursa, ilettiğim koddaki users sorgusuna ek olarak pages sorgusu atayamaz mıyız?
    Teşekkürler
  • 28-12-2021, 23:20:54
    #6
    Union All kullanabilirsiniz. While döngüsü içerisinde düzenleme yapmanız gerekecek.