none
üyeler tablosunda kayıtlı verilere göre bölgeleri çekme RRS feed

  • Soru

  • Arkadaşlar Merhaba

    öğretmenler diye bir tablomuz var

    öğretmen kayıt olurken bölge seçimi yapmaktadır 

    birden fazla bölgeyi listbox ile seçmektedir bunlar 

    bölgeler adlı veritabanına satır satır üye id ile kayıt olmaktadır 

    fakat

    datalistte bu verilere ulaşmak istediğimde

    her bölge için üye bilgilerini tek tek yazdırıyor

    yani öğretmen 5 bölgede hizmet vericek ise 

    öğretmenleri listelediğimde  1 kayıt 5 defa yazılıyor 

    yardımcı olmanızı istediğim konu 

    öğretmen tablosundaki bir id deki özellikleri (isim soy isim tel adres vb) bir kere sıralayıp 

    bölgeler tablosundaki öğretmen id nin seçmiş olduğu bölgeleri tek bir seferde nasıl çekebilirim 

    yardımlarınız için şimdiden teşekkür ederim

    24 Ocak 2018 Çarşamba 16:51

Yanıtlar

  • SELECT [uyeler].*, [yenitablo].[secilenbolgeler] 
    FROM [uyeler] 
    LEFT JOIN 
        (SELECT [uyeid],
            STUFF(
                (SELECT DISTINCT ',' + [bolgeadi]
                 FROM [bolgeler]
                 WHERE [uyeid] = a.[uyeid]
                 FOR XML PATH (''))
            , 1, 1, '')  AS [secilenbolgeler]
        FROM [bolgeler] AS [a]
        GROUP BY [uyeid]
        ) AS [yenitablo]
    ON [uyeler].[id]=[yenitablo].[uyeid]



    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...



    • Yanıt Olarak İşaretleyen koray bozkurt 24 Ocak 2018 Çarşamba 20:19
    • Düzenleyen MuratAKSARAY 25 Ocak 2018 Perşembe 20:47
    24 Ocak 2018 Çarşamba 20:05

Tüm Yanıtlar

  • sürekli denemeler yapıyorum kodlar değişiyor
    24 Ocak 2018 Çarşamba 18:33
  • SELECT [uyeler].*, [yenitablo].[secilenbolgeler] 
    FROM [uyeler] 
    LEFT JOIN 
        (SELECT [uyeid],
            STUFF(
                (SELECT DISTINCT ',' + [bolgeadi]
                 FROM [bolgeler]
                 WHERE [uyeid] = a.[uyeid]
                 FOR XML PATH (''))
            , 1, 1, '')  AS [secilenbolgeler]
        FROM [bolgeler] AS [a]
        GROUP BY [uyeid]
        ) AS [yenitablo]
    ON [uyeler].[id]=[yenitablo].[uyeid]



    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...



    • Yanıt Olarak İşaretleyen koray bozkurt 24 Ocak 2018 Çarşamba 20:19
    • Düzenleyen MuratAKSARAY 25 Ocak 2018 Perşembe 20:47
    24 Ocak 2018 Çarşamba 20:05
  • murat bey çok teşekkür ederim emeğiniz için evet kod güzel çalışıyor veritabanınıda peki bunu asp.net olarak nasıl listeleyebilirim ? yardımcı olabilrimisiniz
    24 Ocak 2018 Çarşamba 20:19
  • Bir SqlDataSource ve bir Repeater kullanarak listeleyebilirsiniz.

    Başarılar...


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    24 Ocak 2018 Çarşamba 20:29
  • SELECT [uyeler].*, [yenitablo].[secilenbolgeler] 
    FROM [uyeler] 
    LEFT JOIN [yenitablo] ON [uyeler].[id]=[yenitablo].[uyeid]
        (SELECT [uyeid],
            STUFF(
                (SELECT DISTINCT ',' + [bolgeadi]
                 FROM [bolgeler]
                 WHERE [uyeid] = a.[uyeid]
                 FOR XML PATH (''))
            , 1, 1, '')  AS [secilenbolgeler]
        FROM [bolgeler] AS [a]
        GROUP BY [uyeid]
        ) AS [yenitablo]


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...


    Murat Bey,

    Sorgunuzda kullandığınız "FOR XML PATH" yapısını ilk defa gördüm, araştırdım, öğrendim, teşekkürler.

    Fakat sorgunun kendisini çalıştıramadım; syntax hatası aldım.  Hatanın nedeni, galiba LEFT JOIN kısmı ile, onu takip eden "(SELECT [uyeid], STUFF(..." ifadesi arasında.  Burada eksik bir virgül olduğunu düşündüm, ama sorun bu değil.

    Ben sorguyu şu şekilde çalıştırdım (yine sizin sorgudaki temeli kullanarak):

    WITH [yenitablo] AS
         (SELECT [uyeid],
                  STUFF((SELECT DISTINCT ',' + [bolgeadi]
                         FROM [bolgeler]
                         WHERE [uyeid] = a.[uyeid]
                         FOR XML PATH ('')), 1, 1, '')  AS [secilenbolgeler]
           FROM [bolgeler] AS [a]
           GROUP BY [uyeid])
    SELECT [uyeler].*, [yenitablo].[secilenbolgeler] 
    FROM [uyeler]
    LEFT JOIN [yenitablo] ON [uyeler].[id] = [yenitablo].[uyeid];

    Yani önce [yenitablo] adlı ara tablonun tanımını yaptırıyorum, sonra SELECT sorgusuna geçiyorum.

    Sonuç:

    Test için kullandığım DDL komutları:

    CREATE TABLE uyeler
    (
    id INT PRIMARY KEY,
    adi VARCHAR(50) NOT NULL
    );
    
    INSERT INTO uyeler (id, Adi) VALUES (1,  'Ahmet');
    INSERT INTO uyeler (id, Adi) VALUES (2,  'Mehmet');
    INSERT INTO uyeler (id, Adi) VALUES (3,  'Hulya');
    
    CREATE TABLE bolgeler
    (
    uyeid INT,
    bolgeadi VARCHAR(50) NOT NULL
    );
    
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (1,  'Akdeniz');
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (1,  'Dogu Anadolu');
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (2,  'Ege');
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (2,  'Dogu Anadolu');
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (3,  'Ic Anadolu');
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (3,  'Marmara');
    INSERT INTO bolgeler (uyeid, bolgeadi) VALUES (3,  'Karadeniz');

    Burada hata veren sorgu var: http://sqlfiddle.com/#!18/4e53c/19

    Burada çalışan sorgu var: http://sqlfiddle.com/#!18/b5d7e/1

    Her iki linkde de aynı DDL komutlarını kullandım.  Kullandığınız tablo ve alan isimlerini DDL komutları içinde aynen kullandım, değiştirmedim.

    Bakabilirseniz memnun olurum.

    25 Ocak 2018 Perşembe 20:20
  • Ahmet SABUNCU,

    yanıtları genellikle cep telefonumdan yazdığım için bazen yazım hataları olabiliyor. 

    SQL ifadeyi düzenledim. 

    Uyarınız için teşekkür ederim...


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    25 Ocak 2018 Perşembe 20:53
  • Evet bu çalışıyor.  Teşekkür ederim.
    25 Ocak 2018 Perşembe 21:00