• 02-11-2010, 02:41:29
    #10
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Arkadaşım yanlış anlamadıysam, sen her iki tablodan tek sorguda aynı kullanıcıya ait verileri çekiyim diye böyle yapıyorsun. Ancak bu durumda tablolar birbiriyle ilişkili olmadığından tekrarlaması normal. Yani kayıt sayıları birbiriyle aynı değil, birbirini bağlayan bir alan olmadığından. Tablo durumunu da tam bilemediğimizden tahminen left join kullanman gerekli gibi.

    Alıntı:
    Alıntı
    Klasik Join
    İki tabloyu birlikte sorgulamanın en kolay yolu, asıl tablodaki birincil anahtar ile ikinci tablodaki yabancı anahtarı birbirine eşitlemektir.

    Örneğin
    Kod:
    SELECT Kitap.kitapNo,Odunc.kitapNo
    FROM Kitap,Odunc
    WHERE Kitap.kitapNo=Odunc.kitapNo

    Left [Outer] Join
    İki tablo arasında ilişkili sorgu yapılırken, birinci tablodaki tüm kayıtlar getirilir. 2. Tabloda ise sadece ilişkiye göre uygun kayıtlar sağ tarafına eklenir.

    Örneğin
    Kod:
    SELECT uye.Adi,odunc.KitapNo
    FROM uye LEFT JOIN odunc ON odunc.uyeNo=uye.uyeNo

    Right [Outer] Join

    İki tablo arasında ilişkili sorgu yapılırken, ikinci tablodaki tüm kayıtlar getirilir. 1. Tabloda ise sadece ilişkiye göre uygun kayıtlar sağ tarafına eklenir.

    Örneğin
    Kod:
    SELECT Kitap.kitapAdi
    FROM Kitap
    RIGHT JOIN odunc ON odunc.KitapNo=Kitap.KitapNo
    WHERE odunc.geldiMi=0

    [Inner] Join
    INNER JOIN en çok kullanılan tablo birleştirme yöntemidir. İki tablo arasında birleştirme yaparken, tablolardan her ikisinde de yer alan değerler seçilir, tek tabloda yer alan değerler seçilmez.
    Aslında, Klasik Join ile INNER JOIN aynı şeydir. Sadece birleştirmede kullanılan teknik farklıdır.

    Örneğin
    Kod:
    SELECT uye.Adi,odunc.KitapNo
    FROM uye INNER JOIN odunc ON odunc.uyeNo=uye.uyeNo
  • 02-11-2010, 08:10:42
    #11
    Üyeliği durduruldu
    metadige adlı üyeden alıntı: mesajı görüntüle
    Arkadaşım yanlış anlamadıysam, sen her iki tablodan tek sorguda aynı kullanıcıya ait verileri çekiyim diye böyle yapıyorsun. Ancak bu durumda tablolar birbiriyle ilişkili olmadığından tekrarlaması normal. Yani kayıt sayıları birbiriyle aynı değil, birbirini bağlayan bir alan olmadığından. Tablo durumunu da tam bilemediğimizden tahminen left join kullanman gerekli gibi.

    Alıntı:

    Evet aynı kullanıcıya ait verileri çekmek istiyorum. Ama bu iki tabloyu username alanı ile ilişkilendiriyoz ya? Yâni KeLKuN arkadaşımızın örnek verdiği gibi:


    SELECT fc.id, fc.title, fp.id AS fpid, fp.title AS fptitle
    FROM forum_content AS fc, forum_polls AS fp
    WHERE fc.username = '{$user->username}' AND fp.username = '{$user->username}'
    Tablo yapısı:

      `id` int(11) unsigned NOT NULL auto_increment,
      `content` text NOT NULL,
      `title` varchar(40) NOT NULL,
      `username` varchar(20) NOT NULL
  • 03-11-2010, 10:06:07
    #12
    Üyeliği durduruldu
    Arkadaşlar sorunu hâlâ çözebilmiş değiliz.
  • 03-11-2010, 20:13:43
    #13
    Eposta Aktivasyonu Gerekmekte
    İki tablodada aynı alanlar olduğu için sorgundan istediğin sonucu alamıyorsun

    Tablolardaki aynı alanlara farklı sanal isimler vererek çekmelisin.

    Ör.
    $sql = "SELECT c.id,c.title as 'contentTitle',p.id,p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.id=p.id WHERE c.username='{$user->username}'";
    
    $query = mysql_query($sql) or die (mysql_error());
    $assoc = mysql_fetch_assoc($query);
    
    echo $assoc['contentTitle'];
    echo $assoc['pollsTitle'];
    gibi yapmalısın.
  • 04-11-2010, 02:01:55
    #14
    SametAras adlı üyeden alıntı: mesajı görüntüle
    Evet aynı kullanıcıya ait verileri çekmek istiyorum. Ama bu iki tabloyu username alanı ile ilişkilendiriyoz ya? Yâni KeLKuN arkadaşımızın örnek verdiği gibi:


    SELECT fc.id, fc.title, fp.id AS fpid, fp.title AS fptitle
    FROM forum_content AS fc, forum_polls AS fp
    WHERE fc.username = '{$user->username}' AND fp.username = '{$user->username}'
    Tablo yapısı:

      `id` int(11) unsigned NOT NULL auto_increment,
      `content` text NOT NULL,
      `title` varchar(40) NOT NULL,
      `username` varchar(20) NOT NULL
    Arkadaşım sen söylemek istediğimi anlamadın sanırım, tablolar arasında ilişki yok derken birbiriyle uyumsuz demek istedim. Yani forum_content tablosundaki her kayıta karşı forum_polls tablosunda bir kayıt olmadığından tekrarlaması normal. O nedenle alan adı ilişkelenedirmeleri hakkındaki bilgiyi ekledim.

    Senin burada yapman gereken left join kullanmak. Forum_content tablosundaki bütün verileri buna karşın forum_polls tablosunda ilgili yerleri çekeceksin. Yani:

    SELECT fc.id, fc.title AS fc_title, fc.user, fp.title AS fp_title
    FROM forum_content fc
    LEFT JOIN forum_polls fp ON fc.user = fp.user
  • 04-11-2010, 09:51:42
    #15
    Üyeliği durduruldu
    NiZZo_ adlı üyeden alıntı: mesajı görüntüle
    İki tablodada aynı alanlar olduğu için sorgundan istediğin sonucu alamıyorsun

    Tablolardaki aynı alanlara farklı sanal isimler vererek çekmelisin.

    Ör.
    $sql = "SELECT c.id,c.title as 'contentTitle',p.id,p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.id=p.id WHERE c.username='{$user->username}'";
    
    $query = mysql_query($sql) or die (mysql_error());
    $assoc = mysql_fetch_assoc($query);
    
    echo $assoc['contentTitle'];
    echo $assoc['pollsTitle'];
    gibi yapmalısın.
    Sanırım bu sefer olacak. Ben sorguyu şöyle değiştirdim.

    SELECT c.id as 'contentID', c.title as 'contentTitle',p.id as 'pollsID',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='{$user->username}'
    Lâkin EzSQL sorgunun dökümünü şöyle gösteriyor:

        ezSQL (v2.03) Variable Dump..
    
        Array
        (
            [0] => Array
                (
                    [contentID] => 7
                    [contentTitle] => Tanışalım
                    [pollsID] => 1
                    [pollsTitle] => Yeni Sitemiz
                )
    
            [1] => Array
                (
                    [contentID] => 169
                    [contentTitle] => Video istek
                    [pollsID] => 1
                    [pollsTitle] => Yeni Sitemiz
                )
    
            [2] => Array
                (
                    [contentID] => 170
                    [contentTitle] => Program İstek
                    [pollsID] => 1
                    [pollsTitle] => Yeni Sitemiz
                )
    
            [3] => Array
                (
                    [contentID] => 171
                    [contentTitle] => Oyun İstek
                    [pollsID] => 1
                    [pollsTitle] => Yeni Sitemiz
                )
    
        )
    
    
        Type: Array
        Last Query [17]: SELECT c.id as 'contentID', c.title as 'contentTitle',p.id as 'pollsID',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='Administrator'
        Last Function Call: $db->query("SELECT c.id as 'contentID', c.title as 'contentTitle',p.id as 'pollsID',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='Administrator'")
        Last Rows Returned: 4
    Yâni forum_content alanında 4, forum_polls alanında ise 1 tane içerik var. Bu durumda forum_content'i listelerken forum_polls alanındaki içeriği hep tekrarlıyor. Bunu nasıl önleyebiliriz?

    metadige adlı üyeden alıntı: mesajı görüntüle
    Arkadaşım sen söylemek istediğimi anlamadın sanırım, tablolar arasında ilişki yok derken birbiriyle uyumsuz demek istedim. Yani forum_content tablosundaki her kayıta karşı forum_polls tablosunda bir kayıt olmadığından tekrarlaması normal. O nedenle alan adı ilişkelenedirmeleri hakkındaki bilgiyi ekledim.

    Senin burada yapman gereken left join kullanmak. Forum_content tablosundaki bütün verileri buna karşın forum_polls tablosunda ilgili yerleri çekeceksin. Yani:

    SELECT fc.id, fc.title AS fc_title, fc.user, fp.title AS fp_title
    FROM forum_content fc
    LEFT JOIN forum_polls fp ON fc.user = fp.user
    Bu da ikisinde de aynı sayıda veri olmadığı için tekrarlama yapıyor. EzSQL sorgu dökümü şöyle:

    ezSQL (v2.03) Variable Dump..
    
    Array
    (
        [0] => Array
            (
                [id] => 7
                [fc_title] => Tanışalım
                [username] => Administrator
                [fp_title] => Yeni Sitemiz
            )
    
        [1] => Array
            (
                [id] => 169
                [fc_title] => Video istek
                [username] => Administrator
                [fp_title] => Yeni Sitemiz
            )
    
        [2] => Array
            (
                [id] => 170
                [fc_title] => Program İstek
                [username] => Administrator
                [fp_title] => Yeni Sitemiz
            )
    
        [3] => Array
            (
                [id] => 171
                [fc_title] => Oyun İstek
                [username] => Administrator
                [fp_title] => Yeni Sitemiz
            )
    
    )
    
    
    Type: Array
    Last Query [17]: SELECT fc.id, fc.title AS fc_title, fc.username, fp.title AS fp_title
    FROM forum_content fc
    LEFT JOIN forum_polls fp ON fc.username = fp.username WHERE fc.username='Administrator'
    Last Function Call: $db->query("SELECT fc.id, fc.title AS fc_title, fc.username, fp.title AS fp_title
    FROM forum_content fc
    LEFT JOIN forum_polls fp ON fc.username = fp.username WHERE fc.username='Administrator'")
    Last Rows Returned: 4
  • 04-11-2010, 11:35:54
    #16
    Eposta Aktivasyonu Gerekmekte
    username ikisindede aynı olduğu için tekrarlaması normal.
    Group by yada distinc ile dene bakalım.

    SELECT p.id as 'pollsID',c.id as 'contentID', c.title as 'contentTitle',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='{$user->username}' GROUP BY p.id,c.id
    Olmazsa şunu dene.
    SELECT content.*,polls.* FROM (c.id as 'contentID', c.title as 'contentTitle',c.username FROM forum_content as c WHERE c.username='{$user->username}') as content INNER JOIN (SELECT p.id as 'pollsID',p.title as 'pollsTitle',p.username FROM forum_polls as p WHERE p.username='{$user->username}') as polls ON content.username=polls.username
  • 04-11-2010, 12:24:11
    #17
    Üyeliği durduruldu
    NiZZo_ adlı üyeden alıntı: mesajı görüntüle
    username ikisindede aynı olduğu için tekrarlaması normal.
    Group by yada distinc ile dene bakalım.

    SELECT p.id as 'pollsID',c.id as 'contentID', c.title as 'contentTitle',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='{$user->username}' GROUP BY p.id,c.id
    Olmazsa şunu dene.
    SELECT content.*,polls.* FROM (c.id as 'contentID', c.title as 'contentTitle',c.username FROM forum_content as c WHERE c.username='{$user->username}') as content INNER JOIN (SELECT p.id as 'pollsID',p.title as 'pollsTitle',p.username FROM forum_polls as p WHERE p.username='{$user->username}') as polls ON content.username=polls.username
    İlk sorgu yine tekrarlıyor. İkinci sorgu ise hata veriyor. DISTINC ve GROUP BY seçeneklerini bende denedim. Sonuç şöyle:

    Array
    (
        [0] => Array
            (
                [pollsID] => 1
                [contentID] => 7
                [contentTitle] => Tanışalım
                [pollsTitle] => Yeni Sitemiz
            )
    
        [1] => Array
            (
                [pollsID] => 1
                [contentID] => 169
                [contentTitle] => Video istek
                [pollsTitle] => Yeni Sitemiz
            )
    
        [2] => Array
            (
                [pollsID] => 1
                [contentID] => 170
                [contentTitle] => Program İstek
                [pollsTitle] => Yeni Sitemiz
            )
    
        [3] => Array
            (
                [pollsID] => 1
                [contentID] => 171
                [contentTitle] => Oyun İstek
                [pollsTitle] => Yeni Sitemiz
            )
    
    )
    
    
    Type: Array
    Last Query [17]: SELECT p.id as 'pollsID',c.id as 'contentID', c.title as 'contentTitle',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='Administrator' GROUP BY p.id,c.id
    Last Function Call: $db->query("SELECT p.id as 'pollsID',c.id as 'contentID', c.title as 'contentTitle',p.title as 'pollsTitle' FROM forum_content as c INNER JOIN forum_polls  as p ON c.username=p.username WHERE c.username='Administrator' GROUP BY p.id,c.id")
    Last Rows Returned: 4
    İkinci sorgunun hatası:

    Warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''contentID', c.title as 'contentTitle',c.username FROM forum_content as c WHERE '
  • 04-11-2010, 12:37:40
    #18
    Eposta Aktivasyonu Gerekmekte
    Şu şekilde dene bakalım.
    SELECT content.*,polls.* FROM (SELECT c.id as 'contentID', c.title as 'contentTitle',c.username FROM forum_content as c WHERE c.username='{$user->username}') as content INNER JOIN (SELECT p.id as 'pollsID',p.title as 'pollsTitle',p.username FROM forum_polls as p WHERE p.username='{$user->username}') as polls ON content.username=polls.username
    ---
    Yada şunu
    SELECT c.*,(SELECT p.id as 'pollsID',p.title as 'pollsTitle',p.username FROM forum_polls as p WHERE p.username='{$user->username}') as polls FROM forum_content WHERE c.username='{$user->username}')