• 05-02-2013, 10:55:21
    #1
    Merhaba,

    video, video_ekleri adında 2 adet tablom var.

    SELECT videolar.adi, video_ekleri.key, video_ekleri.value
    FROM `videolar`,`video_ekleri`
    WHERE `videolar`.`id` = `video_ekleri`.`video_id`
    Böyle bir kodum var;

    Döndürdüğü sonuçlar ise;
    adi | key | value
    TEST oto 1
    TEST reklam 'ABC'
    TEST yorum 'KAPALI'
    TEST2 oto 0
    TEST2 reklam 'NULL'
    TEST2 yorum 1

    Bu şekilde sonuçlar çıkıyor,

    Ben ise şunu yapmak istiyorum, bildiğiniz limitlendirme.

    Ama limitlendirme dönen sonuç sayısına göre yapıyor.

    Bu şekilde olursa meta'lar eksik veya hiç gelmeyebilir.

    Meta * limit sayısı demeyin, çünkü meta sayıları sabit değil, 10 tane de meta olabilir bir video da hiç de olmayabilir.

    Bu sorunu nasıl aşabilirim ?
  • 05-02-2013, 11:57:40
    #2
    tablo tasarımını paylaşma imkanın varsa iyi olur, kelimeler ile yüzeysel anlam çıkıyor.
    meta dediğiniz video_ekleri tablosundan alınan 1 veya 1+ satırlar mı?
  • 05-02-2013, 12:31:34
    #3
    miscel adlı üyeden alıntı: mesajı görüntüle
    tablo tasarımını paylaşma imkanın varsa iyi olur, kelimeler ile yüzeysel anlam çıkıyor.
    meta dediğiniz video_ekleri tablosundan alınan 1 veya 1+ satırlar mı?
    Video_ekleri tablosundan birden fazla veri döndürüyor. Disaridayim şuanda o yüzden tabloları veremiyorum.
  • 05-02-2013, 14:01:39
    #4
    ilk anda aklıma birden çok yol geliyor.

    Mesela ben dediğiniz yöntemi 1 verinin çok kategoride olduğu sitelerimde 3 tablo ile tek sorguda limitleyerek kullanıyorum.

    Bir başka yazılımda şöyle kullandım, 2 ayrı sorgu ile. İlk sorguda tüm makaleleri aldım, ve ikinci sorguda ilk sorguda dönen ID değerlerini 2. sorguda WHERE IN ile belirterek ya da JOIN ile birleştirerek tüm yorumları listeledim php kodlarıyla verileri ilgili dizilere atadım.
    Yani 10 makale 2000 yorumu toplam 2 sorguda aldım.

    Diğer bir yöntem verileri serialize ederek aynı tabloda bir kolonda saklayabilirsin.

    Başka bir örnek açık kaynak kodlu wordpressin makaleler-kategoriler,etiketler-ilişkiler tablosunu inceleyebilirsiniz.

    Şu anki sorgunuzda gruplasanız olmaz, limitleseniz olur ama istediğiniz sonuçlar dönmez.
  • 06-02-2013, 05:29:24
    #5
    miscel adlı üyeden alıntı: mesajı görüntüle
    tablo tasarımını paylaşma imkanın varsa iyi olur, kelimeler ile yüzeysel anlam çıkıyor.
    meta dediğiniz video_ekleri tablosundan alınan 1 veya 1+ satırlar mı?
    SQL sorumun yeni hali;
    SELECT videolar.id, videolar.adi,video_ekleri.ek_id,video_ekleri.key, video_ekleri.value
    FROM `videolar`,`video_ekleri`
    WHERE `videolar`.`id` = `video_ekleri`.`video_id`
    tablolar;
    CREATE TABLE IF NOT EXISTS `videolar` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `adi` varchar(225) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
    
    --
    -- Tablo döküm verisi `videolar`
    --
    
    INSERT INTO `videolar` (`id`, `adi`) VALUES
    (1, 'örnek video'),
    (2, 'do?a belgeseli');
    
    -- --------------------------------------------------------
    
    --
    -- Tablo için tablo yapısı `video_ekleri`
    --
    
    CREATE TABLE IF NOT EXISTS `video_ekleri` (
      `ek_id` int(11) NOT NULL AUTO_INCREMENT,
      `video_id` int(11) NOT NULL,
      `key` varchar(225) NOT NULL,
      `value` varchar(225) NOT NULL,
      PRIMARY KEY (`ek_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
    
    --
    -- Tablo döküm verisi `video_ekleri`
    --
    
    INSERT INTO `video_ekleri` (`ek_id`, `video_id`, `key`, `value`) VALUES
    (1, 1, 'oto', 'acik'),
    (2, 1, 'reklam', 'kapali'),
    (3, 1, 'yorum', 'kapali'),
    (4, 2, 'yorum', 'acik'),
    (5, 2, 'reklam', 'kapali'),
    (6, 2, 'tarih', '06.02.2013');
    miscel adlı üyeden alıntı: mesajı görüntüle
    ilk anda aklıma birden çok yol geliyor.

    Mesela ben dediğiniz yöntemi 1 verinin çok kategoride olduğu sitelerimde 3 tablo ile tek sorguda limitleyerek kullanıyorum.

    Bir başka yazılımda şöyle kullandım, 2 ayrı sorgu ile. İlk sorguda tüm makaleleri aldım, ve ikinci sorguda ilk sorguda dönen ID değerlerini 2. sorguda WHERE IN ile belirterek ya da JOIN ile birleştirerek tüm yorumları listeledim php kodlarıyla verileri ilgili dizilere atadım.
    Yani 10 makale 2000 yorumu toplam 2 sorguda aldım.

    Diğer bir yöntem verileri serialize ederek aynı tabloda bir kolonda saklayabilirsin.

    Başka bir örnek açık kaynak kodlu wordpressin makaleler-kategoriler,etiketler-ilişkiler tablosunu inceleyebilirsiniz.

    Şu anki sorgunuzda gruplasanız olmaz, limitleseniz olur ama istediğiniz sonuçlar dönmez.
    1. Yöntem çok zorlar sistemi diye düşünüyorum, şöyleki, 100 bin video varsa, yaklaşık 5.00000 ek veri olacak.

    Wordpress'in kullandığı sistemi çözemedim.

    Bu konu hakkında ücretli / ücretsiz yardım bekliyorum. İlgilenen herkese teşekkürler
  • 06-02-2013, 07:31:33
    #6
    Üyeliği durduruldu
    Hiç bir şey anlamadım desem? Meta'ları neye göre alıyorsunuz?
  • 06-02-2013, 14:50:37
    #7
    Cycl0ne adlı üyeden alıntı: mesajı görüntüle

    CREATE TABLE IF NOT EXISTS `videolar` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `adi` varchar(225) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
    
    --
    -- Tablo döküm verisi `videolar`
    --
    
    INSERT INTO `videolar` (`id`, `adi`) VALUES
    (1, 'örnek video'),
    (2, 'do?a belgeseli');
    
    -- --------------------------------------------------------
    
    --
    -- Tablo için tablo yapısı `video_ekleri`
    --
    
    CREATE TABLE IF NOT EXISTS `video_ekleri` (
      `ek_id` int(11) NOT NULL AUTO_INCREMENT,
      `video_id` int(11) NOT NULL,
      `key` varchar(225) NOT NULL,
      `value` varchar(225) NOT NULL,
      PRIMARY KEY (`ek_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
    
    --
    -- Tablo döküm verisi `video_ekleri`
    --
    
    INSERT INTO `video_ekleri` (`ek_id`, `video_id`, `key`, `value`) VALUES
    (1, 1, 'oto', 'acik'),
    (2, 1, 'reklam', 'kapali'),
    (3, 1, 'yorum', 'kapali'),
    (4, 2, 'yorum', 'acik'),
    (5, 2, 'reklam', 'kapali'),
    (6, 2, 'tarih', '06.02.2013');
    video_id  key     value
    1         yorum    kapali
    2         yorum    acik
    Verdiğiniz örnekten edindiğim izlenim kadarı ile; yukarıdaki tablo verisi, kötü yapılandırılmış bir tablo şemasını gözler önüne seriyor. Öncelikle "video_ekleri" gerçekten gerekli bir tablo mu? Eğer tablodaki 'oto', 'reklam', 'yorum' ve 'tarih' gibi alanlar "video" tablosu ile bire-bir ilişki içerisinde ise, mantıken "video_ekleri" tablosundaki satırların, "video" tablosunda sütün olarak belirlenmeleri daha gerçekçi. Bu satırlar dışında kalacak olan ve videolar tablosuna sütün olarak eklenemeyecek satırlar varsa, bunları da "metalar" tablosu altında herhangi bir "key" belirtmeden direkt toplamanızı öneririm.

    Eğer "meta" dediğiniz bilgiler, "video_ekleri" tablosundaki değerler ise istediğiniz sonuçları şu şekilde alabilirsiniz;
    SELECT *
    FROM ((SELECT * from videolar limit 5) t1)
    INNER JOIN video_ekleri t2 ON t1.id = t2.video_id
    Eğer gerekli index düzenlemelerini yaparsanız herhangi bir performans sorunu ile karşılaşmazsınız ancak, yine de, öncelikle tablo yapılarınızı tekrar gözden geçirmenizi öneririm. Mantığa daha uygun bir tablo yapısı ile, daha basit bir sorgu kullanarak, daha fazla performans elde edebilirsiniz.
  • 06-02-2013, 15:03:45
    #8
    PsiCat adlı üyeden alıntı: mesajı görüntüle
    video_id  key     value
    1         yorum    kapali
    2         yorum    acik
    Verdiğiniz örnekten edindiğim izlenim kadarı ile; yukarıdaki tablo verisi, kötü yapılandırılmış bir tablo şemasını gözler önüne seriyor. Öncelikle "video_ekleri" gerçekten gerekli bir tablo mu? Eğer tablodaki 'oto', 'reklam', 'yorum' ve 'tarih' gibi alanlar "video" tablosu ile bire-bir ilşiki içerisinde ise, mantıken "video_ekleri" tablosundaki satırların, "video" tablosunda sütün olarak belirlenmeleri daha gerçekçi. Bu satırlar dışında kalacak olan ve videolar tablosuna sütün olarak eklenemeyecek satırlar varsa, bunları da "metalar" tablosu altında herhangi bir "key" belirtmeden direkt toplamanızı öneririm.

    Eğer "meta" dediğiniz bilgiler, "video_ekleri" tablosundaki değerler ise istediğiniz sonuçları şu şekilde alabilirsiniz;
    SELECT *
    FROM ((SELECT * from videolar limit 5) t1)
    INNER JOIN video_ekleri t2 ON t1.id = t2.video_id
    Eğer gerekli index düzenlemelerini yaparsanız herhangi bir performans sorunu ile karşılaşmazsınız ancak, yine de, öncelikle tablo yapılarınızı tekrar gözden geçirmenizi öneririm. Mantığa daha uygun bir tablo yapısı ile, daha basit bir sorgu kullanarak, daha fazla performans elde edebilirsiniz.

    Çok teşekkür ederim, PsiCat. Tam olarak istediğim şey buydu

    Veritabanı düzeltme şansım şuanda bulunmuyor. Sonradan ekstra alanlar çıkabilir diye yapıyı bu şekilde yapmıştım. Key belirtmeden direk verileri serialize etmek de mantıklı fakat, o tabloya göre de listeleme yapıyorum. IN kullanıyorum orada da. Örnek olarak, reklam açık olanları listeleme yapmak gibi.

    Tekrar teşekkür ediyorum vaktinizi ayırdığınız için.