MYSQL Sql Sorgusu Sorusu
-
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;
-
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;"
-
Anladığım şu : iki tablo arasında ki verileri birleştirip (inner join) bir kıyasla (where) yardırmak istiyorsun ?
-
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 -
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
-
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.idtablo2Bunu 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 (
DrKill tarafından 28/Nis/13 18:09 tarihinde düzenlenmiştir) -
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.
-
"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 )
-
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.
