Detay Verisi Olamayan Ana Kayıtları Listele

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Detay Verisi Olamayan Ana Kayıtları Listele

Mesaj gönderen vkamadan »

Merhaba,
MySQL 4.0.18 InnoDB tabloları kullanıyorum 2 tablom var birisi müşteri diğeri ürün gibi düşünelim, ürün tabloasunda müşterinin ID nosu var ilişkisel alan olarak benim istediğim altsorgu kullanmadan (MySQL in bu sürümü alt sorgu desteklemiyor) belirttiğim ürüne sahip aynı zamanda şu ürüne sahip olmayan müşterileri listelemek.
Örn: Buzdolabı satın almış fakat fırın satın almamaış müşteriler.

Açıklayıcı oolmuştur umarım iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
mceL
Üye
Mesajlar: 56
Kayıt: 28 Eyl 2003 01:19
Konum: Bursa
İletişim:

Mesaj gönderen mceL »

join kullanabilirsiniz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba,
JOIN ilk aklıma gelen yöntem oldu fakat şöyle bir sorun var bir müşterinin bir çok buzdolabı ürünü varsa o müşteri bir çok kez listeleniyor bunun önüne geçmek istiyorum bir örnekle açıklarsanız sevinirim.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Tam emin olamıyorum fakat ben deniyemeceğim için siz bir deneyin bakalım. Şu kod işinizi görebilir.... Tabi burada sadece müşteri isimlerini listeleyebilirsiniz. Yanına ilave bir alan koyunca bahsettiğiniz tekrarlar başlar....

Kod: Tümünü seç

Select distinct M.MUSTERI_AD
from MUSTERI M, URUN U
where M.MUSTERI_NO=U.URUN_NO and U.URUN_NO in (5,6) and U.URUN_NO not in (9,10)
Buzdolabının numarası 5 olsun mesela, Hatta yanında 6 numaralı urunu de almış olanlar fakat 9 numaralı frının ile 10 numarlaı diğer bir ürünü almamış olanlar.....

Kolay gelsin....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Fahrettin abi, tamamdır muşteri id alanına göre distinct uygulayıp gerekli diğer alanları LookupField olarak aldım ilginiz için teşekkür ederim.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,
Şimdi yukarıda Fahrettin abinin örneğinde, örneğin 5 ve 6 nolu ürünlerden herhangi birine sahipte olsa ilgili kayıt listeleniyor, mutlaka iki yada daha fazla belirtilen ürüne sahip olupta mutlaka şu ve şu ürünlere sahip olmayanlar cümlesini nasıl oluşturabiliriz, AND işe yaramıyor yaramaması da çok normal. Çok teşekkür ederim şimdiden.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

İsteğiniz tam anlayaamdım ama Sybase'de şöyle bir şey vardı. IN operatoru gibi ALL operatoru vardı. IN gibi icinden sadece bir tanesi ile eşleşmesi değil bütün değerlerin eşleşmesi durumuna gore kayıtları filtreleyebiliyordu.... MySQL de benzer bir operator olabilir..

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

İsteğiniz tam anlayaamdım ama Sybase'de şöyle bir şey vardı. IN operatoru gibi ALL operatoru vardı. IN gibi icinden sadece bir tanesi ile eşleşmesi değil bütün değerlerin eşleşmesi durumuna gore kayıtları filtreleyebiliyordu.... MySQL de benzer bir operator olabilir..
Evet tam olarak Sybase deki ALL operatorunun yapması gerekeni yapmaya çalışıyorum, Kesinlikle TV ve buzdolabı olup , kesinlikle çamaşır makinası ve dvd player i olmayanların listesi ama ne yazıkki subquery kullanmamalıyım.
MySQL de ALL operatoru çalışmıyor varyasyonlarını araştırıyorum.
Teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Exists operatoru standart sql komutudur. Veritabanına ozel bir komut değildir dolayısıyla mysql'de de çalışacaktır diye düşünüyorum... Bir deneyin derim....

Aşağıdaki kod işinizi gorur gibime geliyor... 5 ve 6 numaralı urunler mutlaka olmalı ve de 9 ile 10 numaralu urunler de kesinlikle olmamalı. Diger urunleri de benzer mantıkta query ye ekleyebilirsiniz....

Kod: Tümünü seç

Select * from MUSTERI M
where exists(Select 1 from URUN U where M.MUSTERI_NO=U.MUSTERI_NO and U.URUN=5) and
exists(Select 1 from URUN U where M.MUSTERI_NO=U.MUSTERI_NO and U.URUN=6) and
...
...
not exists(Select 1 from URUN U where M.MUSTERI_NO=U.MUSTERI_NO and U.URUN=9) and
not exists(Select 1 from URUN U where M.MUSTERI_NO=U.MUSTERI_NO and U.URUN=10) 
...
...
Kolay gelsin....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

İlginize teşekkür ederim,
Ancak SubQuery desteklemiyor MySQL 4.0.18 , versiyon değiştirme ihtimalimde yok, bu komutlar çalışmadı bu yüzden.Bu durumda SQL Cümlesi kullanarak yapamayacağım anlamına geliyor sanırım.
Volkan KAMADAN
www.polisoft.com.tr
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

functionlar varmıydı hatırlamıyorum 4x'de. Eğer varsa functionları kullanın.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

mkysoft yazdı:functionlar varmıydı hatırlamıyorum 4x'de. Eğer varsa functionları kullanın.
Teşekkürler,
Aslında 4.1 sürümünü bütün müşterilerde güncelleme yapma sorunu olmasa kullanmak isterim ama bu benim için büyük sorun, mevcut 4.0.18 sürümünde function kullanılabiliyormus sitede öyle diyor, forumda firebird için UDF tanımlama örneği var ancak delphi de dll olarak yazdığım fonksiyonları MySQL tanımlama konusunda sorunum var yani hiç bir firim yok, MySQL sitesinde C kodlarıyla derlemeden felan bahsediyor anlayamadım, ilgilenen olduysa daha önce bilgisini rica ediyorum.
Teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Tamam şimdi delphide test amaçlı iki integer parametre alıp geriye bunların toplamını integer döndüren bir function DLL i yazdım , MySQL e bu fonksiyonu şu şekilde tanımladım ,

Kod: Tümünü seç

CREATE FUNCTION toplam RETURNS INTEGER SONAME 'first.dll'
öncelikle bunu tanımlarken bana toplam_init bulunamadı dedi, oysaki DLL de toplam adında tek bir func vardı neyse baktım olacak gibi değil bide toplam_init tanımladım buda parametre almıyor geriye 1 döndürüyor neyse kabül etti, ancak kullanırken bana 23122145454545 gibi saçma bir sonuç veriyor ne sayı gönderirsem göndereyim fark etmiyor, şimdi anladığım kadarıyla yüklemek istediğimiz fonksiyonun xxx_init ve xxxdinit adında iki tane daha initiazilation ve finalization fonksyionu olması lazım tam anlayamadım birde CREATE FUNCTION deyimiden çıkış değerinin tipi belirtiliyor lakin kaç giriş parametresi olacak tipleri nelerdir gibi birtanımlama yok, oldukça kafam karıştı işin içinden çıkamadım.
Volkan KAMADAN
www.polisoft.com.tr
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

Gerçi yukarda açıklayıcı olmuş ama 3-4 satır ornek veri ile almak istediginiz sonucu yazabilir misin. Left join ile cozulebilir gibime geliyor.

// Yok bu şekilde çözülmediğini farkettim.
onaydin
Üye
Mesajlar: 202
Kayıt: 07 Şub 2006 02:30

Mesaj gönderen onaydin »

Temporary table kullanarak çözülebiliyor.

Kod: Tümünü seç

CREATE TEMPORARY TABLE urunler_var SELECT cari_id, urun_id
FROM urun_satis
WHERE urun_id =1
UNION 
SELECT cari_id, urun_id
FROM urun_satis
WHERE urun_id =2;

/* yukardaki ürünlere sahip tüm üyeler */

create temporary table cariler
SELECT cari_id 
FROM urunler_var
group by cari_id 
having count(cari_id) = 2;

/* Her 2 ürüne de sahip olanları görmek istediğmden burada 2 değeri dönmesi gerekiyor ve değişken olarak 2 koyuyorum */

create temporary table cari_ve_kac_adet
select c.cari_id, count(c.cari_id) from cariler c
inner join urun_satis us on c.cari_id = us.cari_id
group by c.cari_id;


select * from cari_ve_kac_adet;
Netice olarak bu şekilde gidilerek istenilen sonuca ulaşılabilir, php vasıtasıyla sorguyu dondurmeyi denedim ancak bir yerde takıldım fakat phpmyadminden istediğim sonucu alabildim. Gerçi sorguları yazdıkça saçmalamışım gibime geldi ama bir şekilde sonuca ulaşılmış oluyor :oops: . Mantık subquery de alacağımız sonuçları geçici tablolara atıp oradan kullanmak. Mysql 4.0 üzerinde temporary table ların destekleniyor olması lazım. Kolay gelsin
Cevapla