MYSQL Sql Sorgusu Sorusu

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    2 stunlu 2 adet tablo var

    tablo1 = idtablo1 , idtablo2_idtablo2

    tablo2 = idtablo2, veri

     

    tablo1 deki idtablo2_idtablo2,   tablo2 nin pk'ni gösteren bir Foreign Key ve NOT NULL değerinde.

    Tablo1 için örnek veri seti;

    1, 1

    2, 2

    7, 7

    8, 8

     

    Tablo2 için örnek veri seti

    1, "veri1"

    2, "veri2"

    3, "veri3"

    4, "veri4"

    5, "veri5"

    6, "veri6"

    7, "veri7"

    8, "veri8"

    Seneryo şu; bazen tablo1'den veriler siliniyor. Verisetinde olduğu gibi. Benim yapmak istediğim tablo1 tarafından gösterilmeyen tablo2 değerlerini bulmak. Bu örnekte;

    3, "veri3"

    4, "veri4"

    5, "veri5"

    6, "veri6"

    verilerini bulmam lazım. Böyle basit birşeyi yapamadığım için kendimden utanıyorum. Kafam durdu bu gün sanırım iyicene. Yardım ederseniz sevinirim.

     

    LEFT veya RIGHT join ile verileri çıkarabiliyorum... NULL olan yada olmayan tümünü listeleyebiliyorum ancak sadece null değerli olanlanları listeleyemedim. Ulan anlatma kabiliyetimde azaldı neyse siz yukarıdaki örnekten anlarsınız umarım.

     

     

     

    --
    -- Tablo için tablo yapısı `tablo1`
    --
    
    CREATE TABLE IF NOT EXISTS `tablo1` (
      `idtablo1` int(11) NOT NULL AUTO_INCREMENT,
      `tablo2` int(11) NOT NULL,
      PRIMARY KEY (`idtablo1`),
      KEY `tablo2` (`tablo2`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
    
    --
    -- Tablo döküm verisi `tablo1`
    --
    
    INSERT INTO `tablo1` (`idtablo1`, `tablo2`) VALUES
    (1, 1),
    (2, 3),
    (3, 6),
    (4, 7);
    
    -- --------------------------------------------------------
    
    --
    -- Tablo için tablo yapısı `tablo2`
    --
    
    CREATE TABLE IF NOT EXISTS `tablo2` (
      `idtablo2` int(11) NOT NULL AUTO_INCREMENT,
      `veri` varchar(20) NOT NULL,
      PRIMARY KEY (`idtablo2`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
    
    --
    -- Tablo döküm verisi `tablo2`
    --
    
    INSERT INTO `tablo2` (`idtablo2`, `veri`) VALUES
    (1, 'verinin böylesi'),
    (2, 'veri2'),
    (3, 'bu bir veri'),
    (4, 'buna veri diyenin'),
    (5, 'böyle veri olmaz ols'),
    (6, 'hadi bizimde verimiz'),
    (7, 'haydi veriler tabana');
    
    --
    -- Dökümü yapılmış tablolar için kısıtlamalar
    --
    
    --
    -- Tablo kısıtlamaları `tablo1`
    --
    ALTER TABLE `tablo1`
      ADD CONSTRAINT `tablo1_ibfk_1` FOREIGN KEY (`tablo2`) REFERENCES `tablo2` (`idtablo2`) ON DELETE NO ACTION ON UPDATE CASCADE;

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SSPPSS
    SSPPSS's avatar
    Kayıt Tarihi: 26/Ağustos/2007
    Erkek

    hocam soruyu tam anlayamadığım için direk query yazamıyorum ama "is null" operatörüyle yapabilirsin gibime geliyo ?

    "...join tablo2 on tablo1.field = tablo2.field

    where tablo2.field2 is null;"

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erc
    erc's avatar
    Kayıt Tarihi: 23/Aralık/2010
    Erkek

    Anladığım şu : iki tablo arasında ki verileri birleştirip (inner join) bir kıyasla (where) yardırmak istiyorsun ?

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    freudSusHaksizsin bunu yazdı

    hocam soruyu tam anlayamadığım için direk query yazamıyorum ama "is null" operatörüyle yapabilirsin gibime geliyo ?

    "...join tablo2 on tablo1.field = tablo2.field

    where tablo2.field2 is null;"

    Söylediğin şeyi çok önce denemiştim hocam ancak maalesef hiç sonuç dönemiyor veritabanı sunucusu. Açıkçası anlamadım. Şimdi phpmyadmin ile örnek sql i hazırlayıp yayınlarım sorunun anlaşılması için.

     

    Yukarıya ekledim tablo1 in göstermediği

    şu tablo 2 verilerini listelemem lazım.

     

     

       
      (2, 'veri2'),
       
      (4, 'buna veri diyenin'),
      (5, 'böyle veri olmaz ols'),
       
       

     

    DrKill tarafından 28/Nis/13 17:38 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SSPPSS
    SSPPSS's avatar
    Kayıt Tarihi: 26/Ağustos/2007
    Erkek

    böyle bişey sanırım istediğin : 

    select table.*, table2.* from table t
    inner join table2 t2 on
    t.id = t2.id
    where t.id not in (select id from t2);

    edit: dur ben tabloyu oluşturup deneyeyim bi

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    erc bunu yazdı

    Anladığım şu : iki tablo arasında ki verileri birleştirip (inner join) bir kıyasla (where) yardırmak istiyorsun ?

    SELECT t1.idtablo1, t1.tablo2, t2.idtablo2, t2.veri FROM tablo2 as t2
    LEFT JOIN tablo1 as t1
    ON t1.tablo2 = t2.idtablo2

     

    Bunu zaten yapabiliyorum ancak sonuna WHERE t1.idtablo1 = NULL dediğimde bana " MySQL boş bir sonuç kümesi döndürdü (yani sıfır satır). ( Sorgu 0.0004 san. sürdü )" Bunu zaten hiç çözemedim niye böyle yapıyor? Yani mantıken eşit olmayanları listelemesi lazım. Bi bok anlamadım.

     

     @FREUD hocam belirttiğin koda gerek yok şu kod çalışıyor ama bu belirttiğim sorgular çok büyük veritabanında çalışacağını düşünürsek ve çok fazla satır olacağını düşünürsem NOT IN veya IN komutları çok performanssız çalışacaktır.(stackoverflow'un söylediği kadarıyla büyük sonuçlı sorgularda IN içinde select sorguları yada IN'in kapsadığı sonuç sayısı çok fazla olduğunda aşırı derecede performanssız çalışıyormuş bu sorgular)  Daha performanslı bir kod arıyorum açıkçası. Örnek çalışan kod:

    SELECT *
    FROM tablo2 AS t2
    WHERE t2.idtablo2 NOT
    IN
    (


    SELECT t1.tablo2
    FROM tablo1 AS t1

    )

    DrKill tarafından 28/Nis/13 18:09 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Yukarı arkadaşlar. Şu an tek bir NOT IN operatoru ve 2 adet SELECT sorgusu ile bir sonuca vardık ama daha performanslı bir sonuç arıyorum.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    trampfd
    trampfd's avatar
    Kayıt Tarihi: 10/Mayıs/2006
    Erkek

    "IN" büyük kayıtlar için tercih edilmemesi gereken bir operatördür çünkü sql server "IN" ile verdiğin sub query nin döndüreceği her bir satır için "Where" ve "OR" operatörlerini kullanarak karşılaştırma yapar (örn: "Where x=X OR x=Y OR x=...").

     IN yerine EXISTS kullanmanı tavsiye ederim, tablolara indexleme yapmayı da unutma.

    SELECT *
    FROM tablo2
    WHERE NOT EXISTS (select tablo2.id
    					  from tablo1
    					  where tablo1.tablo2id = tablo2.id
    				  )

    Ehl-i Byte
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek
    trampfd bunu yazdı

    "IN" büyük kayıtlar için tercih edilmemesi gereken bir operatördür çünkü sql server "IN" ile verdiğin sub query nin döndüreceği her bir satır için "Where" ve "OR" operatörlerini kullanarak karşılaştırma yapar (örn: "Where x=X OR x=Y OR x=...").

     IN yerine EXISTS kullanmanı tavsiye ederim, tablolara indexleme yapmayı da unutma.

    SELECT *
    FROM tablo2
    WHERE NOT EXISTS (select tablo2.id
    					  from tablo1
    					  where tablo1.tablo2id = tablo2.id
    				  )

    Eyv hocam teşekkür ederim.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
Toplam Hit: 1077 Toplam Mesaj: 9