• 13-02-2022, 22:44:49
    #1
    Merhaba arkadaşlar 2 tablom var iki tablodaki verileri belirli koşullara göre sorgulamam gerekiyor.

    A Tablosunda tweet listem var


    B Tablosunda A Tablosundaki verileri retweetlemiş kullanıcılar ve hangi tweeti retweetlediği veri var. (postlistid; a tablosundaki id değeri)


    Ben sorguda B Tablosundaki hangi kullanıcının hangi tweeti retweetlediğini uzun uğraşlar sonucu tespit ettim ancak;
    B Tablosundaki kullanıcının hangi tweetleri retweetlemediğini tespit edemiyorum.
    B Tablosundaki retweetuserid A tablosundaki hangi satırları retweetlememiş (retweetlediği veriler b tablosunda mevcut.)

    İşin sonunda bir retweetuserid hangi tweetleri retweetlemiş hangilerini retweetlememiş onlara ihtiyacım var.
    Sorgu cümlesinde yardımcı olursanız sevinirim.
  • 13-02-2022, 22:57:23
    #2
    Mantık basit, twit listesindeki id leri bir diziye atacaksınız, diyelim ki;

    $tweets = [4, 6, 7, 5];
    Sonrasında B tablosunda kullanıcının retweet yaptığı twitlerin idlerini bir diziye atacaksınız. Örneğin;

    $retweetsForSelectedUser = [6, 7];
    Bunun sonrasında iki dizi arasındaki farkı almak düşüyor bizede, o da şu şekilde;

    $noRetweets = array_diff($tweets, $retweetsForSelectedUser);
    Kodun bütün hali şu şekilde oluyor;

    $tweets = [4, 6, 7, 5];
    
    $retweetsForSelectedUser = [6, 7];
    
    $noRetweets = array_diff($tweets, $retweetsForSelectedUser);
    
    foreach($noRetweets as $noRetweet) {
      echo $noRetweet . '<br>';
    }
  • 13-02-2022, 23:09:57
    #3
    Zalmoxis adlı üyeden alıntı: mesajı görüntüle
    Mantık basit, twit listesindeki id leri bir diziye atacaksınız, diyelim ki;

    $tweets = [4, 6, 7, 5];
    Sonrasında B tablosunda kullanıcının retweet yaptığı twitlerin idlerini bir diziye atacaksınız. Örneğin;

    $retweetsForSelectedUser = [6, 7];
    Bunun sonrasında iki dizi arasındaki farkı almak düşüyor bizede, o da şu şekilde;

    $noRetweets = array_diff($tweets, $retweetsForSelectedUser);
    Kodun bütün hali şu şekilde oluyor;

    $tweets = [4, 6, 7, 5];
    
    $retweetsForSelectedUser = [6, 7];
    
    $noRetweets = array_diff($tweets, $retweetsForSelectedUser);
    
    foreach($noRetweets as $noRetweet) {
      echo $noRetweet . '<br>';
    }
    cevap için teşekkür ederim ancak;
    bir de kullanıcıid var yani bu tabloda belki binlerce veri dönecek ben aynı zamanda bu kullanıcının yaptığı retweetleri bulmam gerekiyor bu konudaki öneriniz nedir?
  • 13-02-2022, 23:13:34
    #4
    Arifap adlı üyeden alıntı: mesajı görüntüle
    cevap için teşekkür ederim ancak;
    bir de kullanıcıid var yani bu tabloda belki binlerce veri dönecek ben aynı zamanda bu kullanıcının yaptığı retweetleri bulmam gerekiyor bu konudaki öneriniz nedir?
    Hocam zaten ikinci tabloda retweetledikleri var sizinde yazdığınız gibi. Onları ayrı alacaksınız. SQL sorgularını yazmadım ama örneğin id'si 111 olan kullanıcının retweetlerini görmek istiyorsanız;

    SELECT * FROM b_tablosu WHERE retweetuserid = 111
    şeklinde alabilirsiniz. Bu sorgu size 111 id'li kullanıcının retweetlerini verecek. Bu kullanıcının retweet yapmadığı tweetleri bulmak içinde, bu sorgudaki postlistid değerini yeni bir diziye atacaksınız ve sonunda dediğim şekilde karşılaştıracaksınız. SQL sorgularınızı paylaşırsanız ona göre bakabilirim tekrar.
  • 14-02-2022, 10:44:52
    #5
    Zalmoxis adlı üyeden alıntı: mesajı görüntüle
    Hocam zaten ikinci tabloda retweetledikleri var sizinde yazdığınız gibi. Onları ayrı alacaksınız. SQL sorgularını yazmadım ama örneğin id'si 111 olan kullanıcının retweetlerini görmek istiyorsanız;

    SELECT * FROM b_tablosu WHERE retweetuserid = 111
    şeklinde alabilirsiniz. Bu sorgu size 111 id'li kullanıcının retweetlerini verecek. Bu kullanıcının retweet yapmadığı tweetleri bulmak içinde, bu sorgudaki postlistid değerini yeni bir diziye atacaksınız ve sonunda dediğim şekilde karşılaştıracaksınız. SQL sorgularınızı paylaşırsanız ona göre bakabilirim tekrar.
    $tweets = [4, 6, 7, 5];
    $retweetsForSelectedUser = [6, 7];
    $noRetweets = array_diff($tweets, $retweetsForSelectedUser);
    foreach($noRetweets as $noRetweet) {
    echo $noRetweet . '<br>';
    }
    Boş dönüyor sanırım bir hata var.

    Bence daha kolay tek sorgu ile dizelere aktarmadan bunu mysql tarafında çözebileceğim gibi bir his var içimde ama halen yol alamadım.
  • 14-02-2022, 11:03:47
    #6
    retweetuserid 111'in retweet ettiği tweetleri döndürür;
    SELECT * FROM tweets t 
        WHERE EXISTS 
            (SELECT 1 FROM retweets r WHERE r.postlistid = t.id AND r.retweetuserid = 111)
    retweetuserid 111'in retweet etmediği tweetleri döndürür;
    SELECT * FROM tweets t 
        WHERE NOT EXISTS 
            (SELECT 1 FROM retweets r WHERE r.postlistid = t.id AND r.retweetuserid = 111)
  • 14-02-2022, 11:10:31
    #7
    rtweet edilenleri alıp mysql de not in kullanmayı denedin mi?
  • 14-02-2022, 11:10:50
    #8
    ghergedan adlı üyeden alıntı: mesajı görüntüle
    retweetuserid 111'in retweet ettiği tweetleri döndürür;
    SELECT * FROM tweets t
        WHERE EXISTS
            (SELECT 1 FROM retweets r WHERE r.postlistid = t.id AND r.retweetuserid = 111)
    retweetuserid 111'in retweet etmediği tweetleri döndürür;
    SELECT * FROM tweets t
        WHERE NOT EXISTS
            (SELECT 1 FROM retweets r WHERE r.postlistid = t.id AND r.retweetuserid = 111)
    Aradığım sorgu tam da buydu. Diğer arkadaşın da önerdiği yöntem mantıklıydı ama bu daha sade ve şık oldu.
    Problem çözüldü
    Üstad der şapka çıkartırım çok teşekkür ederim.