none
PostgreSql Aynı Kayıttan 1den Fazla Listelenme Sorunu RRS feed

  • Soru

  • Merhabalar, bu konuyla alakalı bir çok forumda olduğu gibi bu forumda da başlık açılmış ancak ben o başlıklardan bir sonuca ulaşamadığım için bu  başlığı açma gereksinimi duydum. 

    Problemim şu, bir ürünün ismini Wpf uygulamamda girip ardından fotoğrafını seçip veritabanına kaydediyorum. Listelemek istediğimde ürünün adını giriyorum ancak aynı üründen 1'den fazla geliyor. Ürünün ne kadar fotoğrafı varsa ürün adı o kadar listeleniyor. Ben bunu istemiyorum, bunu nasıl çözebilirim acaba?

    Kullandığım sql kodu için bir örnek verecek olursam eğer,

    SELECT stoknumarasi, deponumarasi,adi,fotografi From stokno INNER JOIN depo ON stokno.id = depo.id INNER JOIN bilgi ON bilgi.id = stokno.id INNER JOIN fotograf ON fotograf.id = stokno.id Where adi LIKE '%Bilgisayar%'

    Yardımlarınız için şimdiden teşekkür ederim :)

    16 Ekim 2019 Çarşamba 00:27

Yanıtlar

Tüm Yanıtlar

  • inner joinleri kaldirin.

    Gorunen o ki, tablolarininiz arasında 1-to-many iliski var, bu nedenle birden fazla geliyor. Ornegin stokno'daki bir kayıt icin, depoda 2 id, bilgide 3 id, fotografda 10 id varsa, stokno, depo, bilgi'den gelen satırlar 10'ar kere tekrarlanacak ve sonucta 2 * 3 * 10 30 satir gelecek. SQL'in normal işleyişi boyle.

     



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    • Yanıt Olarak İşaretleyen Utku Uludağ 16 Ekim 2019 Çarşamba 19:11
    16 Ekim 2019 Çarşamba 08:42
    Yanıtlayıcı
  • inner joinleri kaldirin.

    Gorunen o ki, tablolarininiz arasında 1-to-many iliski var, bu nedenle birden fazla geliyor. Ornegin stokno'daki bir kayıt icin, depoda 2 id, bilgide 3 id, fotografda 10 id varsa, stokno, depo, bilgi'den gelen satırlar 10'ar kere tekrarlanacak ve sonucta 2 * 3 * 10 30 satir gelecek. SQL'in normal işleyişi boyle.

     



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    Dediğiniz gibi joinleri kaldırdım. Bu 30 kere tekrarı önleme veyahut programda listelerken 1 tanesini getirme şansım var mı acaba?
    16 Ekim 2019 Çarşamba 17:16
  • Evet, inner joinleri sadece 1-to-1 eslemelerde kullanın. Zaten bakarsanız, joinli sorgunuz pek de mantıklı degil. Yani bir urunun 10 fotoğrafı varsa, inner joinle eklediğinizde hangi fotogreafi almayı düşünüyorsunuz. Sadece ilki yeter derdeniz, postgreSQL'de lateral kullanabilirsiniz. Ornegin:

    select stoklar.stokAdi, t.foto
    from stoklar, 
    lateral (select fotograf from fortograflar 
             where fotograflar.stokId = stoklar.stokId
             limit 1) t(foto);



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.





    16 Ekim 2019 Çarşamba 20:22
    Yanıtlayıcı
  • Evet, inner joinleri sadece 1-to-1 eslemelerde kullanın. Zaten bakarsanız, joinli sorgunuz pek de mantıklı degil. Yani bir urunun 10 fotoğrafı varsa, inner joinle eklediğinizde hangi fotogreafi almayı düşünüyorsunuz. Sadece ilki yeter derdeniz, postgreSQL'de lateral kullanabilirsiniz. Ornegin:

    select stoklar.stokAdi, t.foto
    from stoklar, 
    lateral (select fotograf from fortograflar 
             where fotograflar.stokId = stoklar.stokId
             limit 1) t(foto);
    Anladım çok teşekkür ederim, elinize sağlık. İyi kodlamalar diliyorum :)
    17 Ekim 2019 Perşembe 00:35